186532025-10-29 18:52:06lalalaAlíz házi feladataicpp17Elfogadva 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";
	}
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva1ms316 KiB
subtask27/7
2Elfogadva1ms316 KiB
3Elfogadva29ms524 KiB
4Elfogadva76ms532 KiB
5Elfogadva153ms12456 KiB
6Elfogadva218ms24104 KiB
7Elfogadva115ms1012 KiB
subtask312/12
8Elfogadva1ms508 KiB
9Elfogadva29ms316 KiB
10Elfogadva149ms1844 KiB
11Elfogadva178ms14388 KiB
12Elfogadva254ms26376 KiB
13Elfogadva100ms552 KiB
subtask416/16
14Elfogadva1ms316 KiB
15Elfogadva1ms508 KiB
16Elfogadva1ms316 KiB
17Elfogadva1ms316 KiB
18Elfogadva1ms316 KiB
19Elfogadva1ms316 KiB
20Elfogadva1ms316 KiB
21Elfogadva1ms316 KiB
22Elfogadva1ms316 KiB
23Elfogadva1ms316 KiB
24Elfogadva1ms316 KiB
subtask522/22
25Elfogadva1ms316 KiB
26Elfogadva1ms508 KiB
27Elfogadva1ms316 KiB
28Elfogadva1ms316 KiB
29Elfogadva1ms316 KiB
30Elfogadva1ms316 KiB
31Elfogadva1ms316 KiB
32Elfogadva1ms316 KiB
33Elfogadva1ms316 KiB
34Elfogadva1ms316 KiB
35Elfogadva1ms316 KiB
36Elfogadva3ms316 KiB
37Elfogadva4ms564 KiB
38Elfogadva4ms820 KiB
39Elfogadva4ms624 KiB
40Elfogadva6ms1076 KiB
41Elfogadva4ms564 KiB
subtask643/43
42Elfogadva1ms316 KiB
43Elfogadva1ms316 KiB
44Elfogadva29ms524 KiB
45Elfogadva76ms532 KiB
46Elfogadva153ms12456 KiB
47Elfogadva218ms24104 KiB
48Elfogadva115ms1012 KiB
49Elfogadva1ms508 KiB
50Elfogadva29ms316 KiB
51Elfogadva149ms1844 KiB
52Elfogadva178ms14388 KiB
53Elfogadva254ms26376 KiB
54Elfogadva100ms552 KiB
55Elfogadva1ms508 KiB
56Elfogadva1ms316 KiB
57Elfogadva1ms316 KiB
58Elfogadva1ms316 KiB
59Elfogadva1ms316 KiB
60Elfogadva1ms316 KiB
61Elfogadva1ms316 KiB
62Elfogadva1ms316 KiB
63Elfogadva1ms316 KiB
64Elfogadva1ms316 KiB
65Elfogadva3ms316 KiB
66Elfogadva4ms564 KiB
67Elfogadva4ms820 KiB
68Elfogadva4ms624 KiB
69Elfogadva6ms1076 KiB
70Elfogadva4ms564 KiB
71Elfogadva142ms1880 KiB
72Elfogadva173ms3364 KiB
73Elfogadva245ms13088 KiB
74Elfogadva212ms15520 KiB
75Elfogadva187ms15296 KiB
76Elfogadva284ms24884 KiB
77Elfogadva291ms24612 KiB