QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#18516#2066. Data Structure QuizfidahakiAC ✓2303ms30380kbC++205.4kb2022-01-19 23:19:202022-05-06 01:41:00

Judging History

This is the latest submission verdict.

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-05-06 01:41:00]
  • Judged
  • Verdict: AC
  • Time: 2303ms
  • Memory: 30380kb
  • [2022-01-19 23:19:20]
  • Submitted

answer

#include <bits/stdc++.h>

typedef long long ll;
typedef unsigned long long ull;
#define FOR(i, a, b) for (int i = a; i <= b; ++i)
#define ROF(i, a, b) for (int i = a; i >= b; --i)

inline ll Max(const ll &a, const ll &b) { return a > b ? a : b; }
inline bool chkmax(ll &a, const ll &b) { return a < b ? a = b, true : false; }

inline int read() {
    int f = 1, x = 0;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-') f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    }
    return x * f;
}

const int N = 5e4 + 7;
const int Q = 1e6 + 7;
const ll INF = (ll)5e13 + 1;
using namespace std;

ll infcnt;
int n, m, q;

struct sgt {
#define ls(x) (x << 1)
#define rs(x) (x << 1 | 1)
    ll mx[N * 4], hmx[N * 4], tag[N * 4], htag[N * 4];
    void pushup(int x) {
        mx[x] = Max(mx[ls(x)], mx[rs(x)]);
        chkmax(hmx[x], mx[x]);
    }
    void pushtag(int x, ll ad, ll had) {  //
        chkmax(hmx[x], mx[x] + had);
        chkmax(htag[x], tag[x] + had);
        mx[x] += ad, tag[x] += ad;
    }
    void pushdown(int x) {
        if (!tag[x] && !htag[x]) return;
        pushtag(ls(x), tag[x], htag[x]), pushtag(rs(x), tag[x], htag[x]);
        tag[x] = htag[x] = 0;
    }
    void change(int x, int l, int r, int ql, int qr, ll w) {
        if (ql <= l && r <= qr) return pushtag(x, w, w);
        int mid = (l + r) >> 1;
        pushdown(x);
        if (ql <= mid) change(ls(x), l, mid, ql, qr, w);
        if (mid + 1 <= qr) change(rs(x), mid + 1, r, ql, qr, w);
        pushup(x);
    }
    ll query(int x, int l, int r, int ql, int qr) {
        if (ql <= l && r <= qr) return hmx[x];
        int mid = (l + r) >> 1;
        ll res = 0;
        pushdown(x);
        if (ql <= mid) chkmax(res, query(ls(x), l, mid, ql, qr));
        if (mid + 1 <= qr) chkmax(res, query(rs(x), mid + 1, r, ql, qr));
        return res;
    }
    void clear() {
        change(1, 1, n, 1, n, INF);
        ++infcnt;
    }
} tr;

#define pb push_back

int xl[Q], xr[Q], yl[Q], yr[Q];
struct jgt {
    int l, r;
    ll w;
    bool operator<(const jgt &a) const { return w < a.w; }
};
vector<jgt> cg[N];
int idq[Q];
ll res[Q];
bool cmpr(const int &a, const int &b) { return xr[a] < xr[b]; }
bool cmpl(const int &a, const int &b) { return xl[a] > xl[b]; }
void solve(int l, int r, int L, int R) {
    if (l > r || L > R) return;
    int mid = (l + r) >> 1;
    vector<int> lr, _l, _r;
    // puts("");
    // printf(" %d %d %d %d\n", l, r, L, R);
    FOR(i, L, R) {
        int I = idq[i];
        if (l == r || (xl[I] <= mid && mid + 1 <= xr[I])) {
            lr.pb(I);
            // printf("%d ", I);
        } else if (xr[I] <= mid) {
            _l.pb(I);
        } else {
            _r.pb(I);
        }
    }
    // puts("\n");
    int szl = (int)_l.size(), szr = (int)_r.size();
    FOR(i, 0, szl - 1) { idq[L + i] = _l[i]; }
    FOR(i, 0, szr - 1) { idq[L + szl + i] = _r[i]; }
    if (l < r) {
        solve(l, mid, L, L + szl - 1);
    }
    FOR(k, l, mid) {
        for (jgt tmp : cg[k]) {
            // printf(" add %d %d %d\n", tmp.l, tmp.r, tmp.w);
            tr.change(1, 1, n, tmp.l, tmp.r, tmp.w);
        }
    }
    // puts("-");
    tr.clear();
    if (mid < r) {
        solve(mid + 1, r, L + szl, L + szl + szr - 1);
    }
    tr.clear();
    sort(lr.begin(), lr.end(), cmpr);
    int p = mid + 1;
    for (int nw : lr) {
        while (p <= xr[nw]) {
            for (jgt tmp : cg[p]) {
                // printf(" add %d %d %d\n", tmp.l, tmp.r, tmp.w);
                tr.change(1, 1, n, tmp.l, tmp.r, tmp.w);
            }
            ++p;
        }
        chkmax(res[nw], tr.query(1, 1, n, yl[nw], yr[nw]) - infcnt * INF);
    }
    // puts("-");
    ROF(k, p - 1, mid + 1) {
        for (jgt tmp : cg[k]) {
            // printf(" add %d %d %d\n", tmp.l, tmp.r, -tmp.w);
            tr.change(1, 1, n, tmp.l, tmp.r, -tmp.w);
        }
    }
    // puts("-");
    tr.clear();
    sort(lr.begin(), lr.end(), cmpl);
    p = mid;
    for (int nw : lr) {
        while (p > xl[nw]) {
            int kel = (int)cg[p].size();
            jgt tmp;
            ROF(i, kel - 1, 0) {  // 这里先负后正
                tmp = cg[p][i];
                // printf(" add %d %d %d\n", tmp.l, tmp.r, -tmp.w);
                tr.change(1, 1, n, tmp.l, tmp.r, -tmp.w);
            }
            --p;
        }
        chkmax(res[nw], tr.query(1, 1, n, yl[nw], yr[nw]) - infcnt * INF);
    }
    // puts("-");
    ROF(k, p, l) {
        for (jgt tmp : cg[k]) {
            // printf(" add %d %d %d\n", tmp.l, tmp.r, -tmp.w);
            tr.change(1, 1, n, tmp.l, tmp.r, -tmp.w);
        }
    }
    // printf("pos %d %d\n", l, r);
    // puts("---");
}

int main() {
    // freopen("C.in", "r", stdin);
    // freopen("C.out", "w", stdout);
    n = read(), m = read(), q = read();
    FOR(i, 1, m) {
        int x = read(), y = read(), xx = read(), yy = read(), w = read();
        cg[x].push_back({y, yy, w});
        cg[xx + 1].push_back({y, yy, -w});
    }
    FOR(i, 1, n) { sort(cg[i].begin(), cg[i].end()); }
    FOR(i, 1, q) { xl[i] = read(), yl[i] = read(), xr[i] = read(), yr[i] = read(), idq[i] = i; }
    solve(1, n, 1, q);
    FOR(i, 1, q) { printf("%lld\n", res[i]); }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 7000kb

input:

5 5 5
1 1 4 5 4
4 1 4 1 10
1 3 3 3 3
1 1 5 5 8
2 4 4 5 8
2 1 2 1
4 1 5 4
1 2 3 5
2 1 5 3
1 3 5 5

output:

12
22
20
22
20

result:

ok 5 lines

Test #2:

score: 0
Accepted
time: 2061ms
memory: 29208kb

input:

50000 50000 500000
16871 5910 38645 11584 102302533
31823 22147 32606 32325 54323252
6264 33722 16831 41670 490722731
14402 13424 44438 47540 518767188
41742 4464 49082 42932 207958498
8082 11986 22079 24809 363258707
19448 35549 28664 48861 978363188
1227 11606 7531 23638 170429582
24192 19262 4841...

output:

6388780705217
3256231743561
2700563425767
3543982704826
6388780705217
6132320153752
6388780705217
4816120679458
4531079315748
6388780705217
6364533581781
6388780705217
6080729936096
6131381460318
6319420244493
4899110043524
6303852912414
6372474571504
6020759826628
5844748884463
3736533382114
638878...

result:

ok 500000 lines

Test #3:

score: 0
Accepted
time: 2041ms
memory: 29508kb

input:

50000 50000 500000
22069 8358 47425 22050 81651787
15811 11426 35575 16481 41660138
16704 1414 49625 10155 152884542
12319 746 16189 19750 958031429
19726 16518 49252 46143 230272355
18291 36326 29644 43595 550525873
20955 28981 38675 34939 94198000
4902 31548 45827 41071 117995501
7302 3717 31781 1...

output:

5658039515636
6158908699079
5848215122796
6219496495548
6265002184172
6265002184172
2681669712599
4746971547364
6265002184172
3350895881774
6260197970482
6241886519042
915657351900
6265002184172
5630722480405
5277824602040
6265002184172
5307640203720
2626310750568
2671340673707
6265002184172
5851825...

result:

ok 500000 lines

Test #4:

score: 0
Accepted
time: 2125ms
memory: 28108kb

input:

50000 50000 500000
5493 3599 34875 20539 915776848
14352 33340 49799 40305 323964320
9847 11157 49716 29692 374854865
13747 473 34429 48469 957104182
32569 20526 33475 47000 252586212
28697 30547 37011 33715 442825744
6350 5118 49389 45210 210032813
34976 18786 48939 43097 505752907
5787 3579 30585 ...

output:

4378955362187
6296243754654
6305752684115
3623041706838
5105636958041
3128663434453
5234069178430
1590212020060
4475499995748
2468998316858
6305752684115
4119470819819
4996302865088
4218591646657
5821114676760
5018403436668
5526024394548
4775567619304
6302907520925
6212462483740
6305752684115
613520...

result:

ok 500000 lines

Test #5:

score: 0
Accepted
time: 2078ms
memory: 28328kb

input:

50000 50000 500000
21621 19739 48132 24209 895126102
10425 12289 33787 17496 901235799
20287 6126 49806 38197 742049381
15050 46191 18201 48491 396368422
40078 44778 47223 44910 979932773
3558 30731 29923 48961 335125614
1319 31288 48642 48550 620834922
6539 10531 10836 23319 598543018
4272 19314 20...

output:

5775411296647
4707963322908
4985522715883
6110349523125
6260672737220
6253384353832
1639016302030
6247016231039
6260672737220
5786945200725
6260672737220
6260672737220
1697603530511
6260672737220
6251015483539
5835276126056
6260672737220
6247016231039
3828417282271
4016480762947
5027731695290
626067...

result:

ok 500000 lines

Test #6:

score: 0
Accepted
time: 2303ms
memory: 29364kb

input:

50000 50000 500000
16871 5910 38645 11584 102302533
31823 22147 32606 32325 54323252
6264 33722 16831 41670 490722731
14402 13424 44438 47540 518767188
41742 4464 49082 42932 207958498
8082 11986 22079 24809 363258707
19448 35549 28664 48861 978363188
1227 11606 7531 23638 170429582
24192 19262 4841...

output:

6388780705217
2592920412653
6388780705217
5792422810550
3403524420132
4469346361285
955556952705
2052432481492
6351625228162
5853671724969
6388780705217
3898011841314
5902622112867
4512840540463
1777067083180
6388780705217
2889303324243
6167526874283
4511922863130
3803579762357
4422164161134
5650552...

result:

ok 500000 lines

Test #7:

score: 0
Accepted
time: 2254ms
memory: 30380kb

input:

50000 50000 500000
22069 8358 47425 22050 81651787
15811 11426 35575 16481 41660138
16704 1414 49625 10155 152884542
12319 746 16189 19750 958031429
19726 16518 49252 46143 230272355
18291 36326 29644 43595 550525873
20955 28981 38675 34939 94198000
4902 31548 45827 41071 117995501
7302 3717 31781 1...

output:

5972666918689
5848215122796
6224891654734
4747585277695
193741762440
3913451592500
748629754445
4780940004894
5455284821809
1283950611486
5195724495107
6265002184172
4600242676770
6265002184172
5186322122659
3492692905131
6265002184172
1220374640535
226763043426
188578806742
837863715764
61326559677...

result:

ok 500000 lines

Test #8:

score: 0
Accepted
time: 2265ms
memory: 29032kb

input:

50000 50000 500000
5493 3599 34875 20539 915776848
14352 33340 49799 40305 323964320
9847 11157 49716 29692 374854865
13747 473 34429 48469 957104182
32569 20526 33475 47000 252586212
28697 30547 37011 33715 442825744
6350 5118 49389 45210 210032813
34976 18786 48939 43097 505752907
5787 3579 30585 ...

output:

4333063267922
2163706881691
1653536562097
1162526347505
119752138581
1399143449328
1424750328920
1534773332548
3298951849097
1488901707278
5329285705656
6293914385538
6236745020123
6297771541397
4068562142442
6191997238619
1657485093290
164365560716
2810210202294
2169511819512
4077951500428
61575328...

result:

ok 500000 lines

Test #9:

score: 0
Accepted
time: 2260ms
memory: 29276kb

input:

50000 50000 500000
21621 19739 48132 24209 895126102
10425 12289 33787 17496 901235799
20287 6126 49806 38197 742049381
15050 46191 18201 48491 396368422
40078 44778 47223 44910 979932773
3558 30731 29923 48961 335125614
1319 31288 48642 48550 620834922
6539 10531 10836 23319 598543018
4272 19314 20...

output:

5631187987076
3250751355342
1408147164258
2769007358382
5786945200725
6255130298882
2326182441673
6251015483539
5279985931756
6247016231039
6002489899331
5739531624923
1695978188532
4119040195445
3365218517064
6257256513131
4393164116250
531693512680
5980905688646
1666797293417
5099517190339
6063207...

result:

ok 500000 lines