186532025-10-29 18:52:06lalalaAlíz házi feladataicpp17Accepted 100/100291ms26376 KiB
// @check-accepted: *
#include <iostream>
#include <algorithm>
using namespace std;

const int c=550005;
long long n, m, t[c], h[c]; // feladatok szama, ido, feladat hossza, hatarido

long long sor1[c], sor2[c], inv2[c], spec[c]; // t illetve h szerint rendeze

bool cmp1(int a, int b) {
    return (t[a]<t[b]);
}
bool cmp2(int a, int b) {
    return (h[a]<h[b]);
}

long long fen[c], db[c];
long long bal[c], jobb[c], mini[c], sum[c];

int lsb(int a) {
    return (a & -a);
}
void add(int a, int b, long long mul) {
    while (a<=n) {
        fen[a]+=b*mul;
        db[a]+=mul;
        a+=lsb(a);
    }
}
long long ask(long long val) {
    int ans=0, pos=0;
    for (int i=19; i>=0; i--) {
        int kov=pos+(1<<i);
        if (kov<=n && fen[kov]<=val) {
            val-=fen[kov];
            pos=kov;
            ans+=db[kov];
        }
    }
    return ans;
}
void range_add(int a, int l, int r, long long val) {
    if (bal[a]>r || jobb[a]<l) {
        return;
    }
    if (l<=bal[a] && jobb[a]<=r) {
        sum[a]+=val;
        mini[a]+=val;
        return;
    }
    int x=2*a, y=2*a+1;
    range_add(x, l, r, val), range_add(y, l, r, val);
    mini[a]=sum[a]+min(mini[x], mini[y]);
}
int solve_nlogn() {
    for (int i=1; i<=n; i++) {
        sor1[i]=i, sor2[i]=i;
    }
    sort(sor1+1, sor1+n+1, cmp1), sort(sor2+1, sor2+n+1, cmp2);
    for (int i=1; i<=n; i++) {
        inv2[sor2[i]]=i;
    }

    for (int i=1; i<=n; i++) {
        long long val=t[sor1[i]];
        add(i, val, 1);
    }

    int pos=1;
    int po=1;
    while (po<n) {
        po*=2;
    }
    for (int i=po; i<2*po; i++) {
        bal[i]=i-po+1, jobb[i]=i-po+1;
        if (bal[i]<=n) {
            sum[i]=h[sor2[bal[i]]];
            mini[i]=sum[i];
        }
    }
    for (int i=po-1; i>=1; i--) {
        bal[i]=bal[2*i], jobb[i]=jobb[2*i+1];
        mini[i]=min(mini[2*i], mini[2*i+1]);
    }

    long long ans=ask(m);
    long long specsum=0, specdb=0;
    for (int i=1; i<=n; i++) {
        int id=sor1[i];
        add(i, t[id], -1);
        int hely=inv2[id];
        range_add(1, hely, n, -t[id]);
        specsum+=t[id], specdb++;

        if (mini[1]>=0) {
            ans=max(ans, 2*specdb+ask(m-specsum));
        } else {
            range_add(1, hely, n, t[id]);
            specsum-=t[id], specdb--;
            add(i, t[id], 1);
        }
    }

    for (int i=0; i<2*po; i++) {
        bal[i]=0, jobb[i]=0, sum[i]=0, mini[i]=0;
    }
    for (int i=0; i<=n; i++) {
        fen[i]=0, db[i]=0;
        sor1[i]=0, sor2[i]=0, inv2[i]=0;
    }
    return ans;
}




signed main() {
	ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
	int tc;
	cin >> tc;
	for (int w=1; w<=tc; w++) {
        cin >> n >> m;
        for (int i=1; i<=n; i++) {
            cin >> t[i] >> h[i];
        }

		cout << solve_nlogn() << "\n";
	}
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted1ms316 KiB
subtask27/7
2Accepted1ms316 KiB
3Accepted29ms524 KiB
4Accepted76ms532 KiB
5Accepted153ms12456 KiB
6Accepted218ms24104 KiB
7Accepted115ms1012 KiB
subtask312/12
8Accepted1ms508 KiB
9Accepted29ms316 KiB
10Accepted149ms1844 KiB
11Accepted178ms14388 KiB
12Accepted254ms26376 KiB
13Accepted100ms552 KiB
subtask416/16
14Accepted1ms316 KiB
15Accepted1ms508 KiB
16Accepted1ms316 KiB
17Accepted1ms316 KiB
18Accepted1ms316 KiB
19Accepted1ms316 KiB
20Accepted1ms316 KiB
21Accepted1ms316 KiB
22Accepted1ms316 KiB
23Accepted1ms316 KiB
24Accepted1ms316 KiB
subtask522/22
25Accepted1ms316 KiB
26Accepted1ms508 KiB
27Accepted1ms316 KiB
28Accepted1ms316 KiB
29Accepted1ms316 KiB
30Accepted1ms316 KiB
31Accepted1ms316 KiB
32Accepted1ms316 KiB
33Accepted1ms316 KiB
34Accepted1ms316 KiB
35Accepted1ms316 KiB
36Accepted3ms316 KiB
37Accepted4ms564 KiB
38Accepted4ms820 KiB
39Accepted4ms624 KiB
40Accepted6ms1076 KiB
41Accepted4ms564 KiB
subtask643/43
42Accepted1ms316 KiB
43Accepted1ms316 KiB
44Accepted29ms524 KiB
45Accepted76ms532 KiB
46Accepted153ms12456 KiB
47Accepted218ms24104 KiB
48Accepted115ms1012 KiB
49Accepted1ms508 KiB
50Accepted29ms316 KiB
51Accepted149ms1844 KiB
52Accepted178ms14388 KiB
53Accepted254ms26376 KiB
54Accepted100ms552 KiB
55Accepted1ms508 KiB
56Accepted1ms316 KiB
57Accepted1ms316 KiB
58Accepted1ms316 KiB
59Accepted1ms316 KiB
60Accepted1ms316 KiB
61Accepted1ms316 KiB
62Accepted1ms316 KiB
63Accepted1ms316 KiB
64Accepted1ms316 KiB
65Accepted3ms316 KiB
66Accepted4ms564 KiB
67Accepted4ms820 KiB
68Accepted4ms624 KiB
69Accepted6ms1076 KiB
70Accepted4ms564 KiB
71Accepted142ms1880 KiB
72Accepted173ms3364 KiB
73Accepted245ms13088 KiB
74Accepted212ms15520 KiB
75Accepted187ms15296 KiB
76Accepted284ms24884 KiB
77Accepted291ms24612 KiB