QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#438211#6755. 方格染色Max_s_xaM100 ✓64ms24844kbC++148.3kb2024-06-10 13:53:402024-06-10 13:53:41

Judging History

你现在查看的是最新测评结果

  • [2024-06-10 13:53:41]
  • 评测
  • 测评结果:100
  • 用时:64ms
  • 内存:24844kb
  • [2024-06-10 13:53:40]
  • 提交

answer

#include <iostream>
#include <algorithm>
#include <vector>

typedef long long ll;
typedef double lf;

// #define DEBUG 1
struct IO
{
    #define MAXSIZE (1 << 20)
    #define isdigit(x) (x >= '0' && x <= '9')
    char buf[MAXSIZE], *p1, *p2;
    char pbuf[MAXSIZE], *pp;
    #if DEBUG
    #else
    IO() : p1(buf), p2(buf), pp(pbuf) {}
    ~IO() {fwrite(pbuf, 1, pp - pbuf, stdout);}
    #endif
    #define gc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, MAXSIZE, stdin), p1 == p2) ? ' ' : *p1++)
    #define blank(x) (x == ' ' || x == '\n' || x == '\r' || x == '\t')

    template <typename T>
    void Read(T &x)
    {
        #if DEBUG
        std::cin >> x;
        #else
        bool sign = 0; char ch = gc(); x = 0;
        for (; !isdigit(ch); ch = gc())
            if (ch == '-') sign = 1;
        for (; isdigit(ch); ch = gc()) x = x * 10 + (ch ^ 48);
        if (sign) x = -x;
        #endif
    }
    void Read(char *s)
    {
        #if DEBUG
        std::cin >> s;
        #else
        char ch = gc();
        for (; blank(ch); ch = gc());
        for (; !blank(ch); ch = gc()) *s++ = ch;
        *s = 0;
        #endif
    }
    void Read(char &c) {for (c = gc(); blank(c); c = gc());}

    void Push(const char &c)
    {
        #if DEBUG
        putchar(c);
        #else
        if (pp - pbuf == MAXSIZE) fwrite(pbuf, 1, MAXSIZE, stdout), pp = pbuf;
        *pp++ = c;
        #endif
    }
    template <typename T>
    void Write(T x)
    {
        if (x < 0) x = -x, Push('-');
        static T sta[35];
        int top = 0;
        do sta[top++] = x % 10, x /= 10; while (x);
        while (top) Push(sta[--top] ^ 48);
    }
    template <typename T>
    void Write(T x, char lst) {Write(x), Push(lst);}
} IO;
#define Read(x) IO.Read(x)
#define Write(x, y) IO.Write(x, y)
#define Put(x) IO.Push(x)

using namespace std;

const int MAXQ = 1e5 + 10, MAXN = 2e5 + 10, INF = 2e9;

int N, M, q;
ll sumA, sumB, sumC, sumAB, sumAC, sumBC, sumABC;

struct Opt
{
    int t, l, r;
    bool operator < (const Opt u) const {return t == u.t ? r < u.r : t < u.t;}
}rw[MAXQ], cl[MAXQ], dg[10];
int rwt, clt, dgt;

int tx[MAXN], ty[MAXN], n, m;

pair <int, int> st[MAXN];
int top;
vector <pair <int, int>> a[MAXN], b[MAXN];

struct Qry
{
    int t, x, f;
    bool operator < (const Qry u) const {return t < u.t;}
}qt[MAXN];
int tot;

int tr[MAXN << 2];
inline void Pushup(int cur) {tr[cur] = tr[cur << 1] + tr[cur << 1 | 1];}
void Update(int cur, int l, int r, int x, int k)
{
    if (x < l || x > r) return;
    if (l == r) tr[cur] += k;
    else
    {
        int mid = l + r >> 1;
        if (x <= mid) Update(cur << 1, l, mid, x, k);
        else Update(cur << 1 | 1, mid + 1, r, x, k);
        Pushup(cur);
    }
}
int Query(int cur, int l, int r, int x, int y)
{
    if (x <= l && r <= y) return tr[cur];
    int mid = l + r >> 1, res = 0;
    if (x <= mid) res += Query(cur << 1, l, mid, x, y);
    if (y > mid) res += Query(cur << 1 | 1, mid + 1, r, x, y);
    return res;
}

int ux[MAXN], uy[MAXN], xx, yy;

int main()
{
    // freopen("ex_color/ex_color7.in", "r", stdin);
    #if DEBUG
    #else
    ios::sync_with_stdio(0), cin.tie(0);
    #endif
    int CASE; Read(CASE);
    Read(N), Read(M), Read(q);
    for (int i = 1, op, x1, y1, x2, y2; i <= q; i++)
    {
        Read(op), Read(x1), Read(y1), Read(x2), Read(y2);
        if (op == 1) rw[++rwt] = Opt{y1, min(x1, x2), max(x1, x2)};
        else if (op == 2) cl[++clt] = Opt{x1, min(y1, y2), max(y1, y2)};
        else dg[++dgt] = Opt{y1 - x1, x1, x2};
        tx[++n] = x1, tx[++n] = x2, ty[++m] = y1, ty[++m] = y2;
    }
    sort(tx + 1, tx + n + 1), n = unique(tx + 1, tx + n + 1) - tx - 1;
    sort(ty + 1, ty + m + 1), m = unique(ty + 1, ty + m + 1) - ty - 1;
    sort(rw + 1, rw + rwt + 1), sort(cl + 1, cl + clt + 1), sort(dg + 1, dg + dgt + 1);
    for (int i = 1; i <= rwt; i++)
    {
        rw[i].t = lower_bound(ty + 1, ty + m + 1, rw[i].t) - ty;
        rw[i].l = lower_bound(tx + 1, tx + n + 1, rw[i].l) - tx;
        rw[i].r = lower_bound(tx + 1, tx + n + 1, rw[i].r) - tx;
    }
    for (int i = 1; i <= clt; i++)
    {
        cl[i].t = lower_bound(tx + 1, tx + n + 1, cl[i].t) - tx;
        cl[i].l = lower_bound(ty + 1, ty + m + 1, cl[i].l) - ty;
        cl[i].r = lower_bound(ty + 1, ty + m + 1, cl[i].r) - ty;
    }
    for (int i = 1; i <= dgt; i++)
    {
        dg[i].l = lower_bound(tx + 1, tx + n + 1, dg[i].l) - tx;
        dg[i].r = lower_bound(tx + 1, tx + n + 1, dg[i].r) - tx;
    }

    for (int l = 1, r; l <= rwt; l = r + 1)
    {
        r = l;
        while (r < rwt && rw[r + 1].t == rw[l].t) r++;
        top = 0;
        for (int i = l, cur; i <= r; i++)
        {
            cur = rw[i].l;
            while (top && st[top].second >= cur) cur = min(cur, st[top].first), top--;
            st[++top] = make_pair(cur, rw[i].r);
        }
        for (int i = 1; i <= top; i++) a[rw[l].t].push_back(st[i]), sumA += tx[st[i].second] - tx[st[i].first] + 1;
        // cout << rw[l].t << ":\n";
        // for (int i = 1; i <= top; i++) cout << st[i].first << ' ' << st[i].second << '\n';
        for (int i = 1; i <= top; i++)
        {
            if (st[i].first > 1) qt[++tot] = Qry{st[i].first - 1, rw[l].t, -1};
            qt[++tot] = Qry{st[i].second, rw[l].t, 1};
        }
    }
    for (int l = 1, r; l <= clt; l = r + 1)
    {
        r = l;
        while (r < clt && cl[r + 1].t == cl[l].t) r++;
        top = 0;
        for (int i = l, cur; i <= r; i++)
        {
            cur = cl[i].l;
            while (top && st[top].second >= cur) cur = min(cur, st[top].first), top--;
            st[++top] = make_pair(cur, cl[i].r);
        }
        for (int i = 1; i <= top; i++) b[cl[l].t].push_back(st[i]), sumB += ty[st[i].second] - ty[st[i].first] + 1;
    }
    int _dgt = dgt; dgt = 0;
    for (int l = 1, r; l <= _dgt; l = r + 1)
    {
        r = l;
        while (r < _dgt && dg[r + 1].t == dg[l].t) r++;
        top = 0;
        for (int i = l, cur; i <= r; i++)
        {
            cur = dg[i].l;
            while (top && st[top].second >= cur) cur = min(cur, st[top].first), top--;
            st[++top] = make_pair(cur, dg[i].r);
        }
        int T = dg[l].t;
        for (int i = 1; i <= top; i++) dg[++dgt] = Opt{T, st[i].first, st[i].second}, sumC += tx[st[i].second] - tx[st[i].first] + 1;
        // cout << T << ":\n";
        // for (int i = 1; i <= top; i++) cout << tx[st[i].first] << ' ' << tx[st[i].second] << "\n";
    }

    sort(qt + 1, qt + tot + 1);
    for (int i = 1, j = 1; i <= n && j <= tot; i++)
    {
        for (auto x : b[i]) Update(1, 1, m, x.first, 1), Update(1, 1, m, x.second + 1, -1);
        while (j <= tot && qt[j].t == i) sumAB += Query(1, 1, m, 1, qt[j].x) * qt[j].f, j++;
    }

    for (int i = 1; i <= dgt; i++)
    {
        xx = yy = 0;
        for (int j = dg[i].l; j <= dg[i].r; j++)
        {
            int cur = lower_bound(ty + 1, ty + m + 1, dg[i].t + tx[j]) - ty;
            int pos = upper_bound(b[j].begin(), b[j].end(), make_pair(cur, INF)) - b[j].begin() - 1;
            bool flag = 0;
            for (int k = max(0, pos - 2); k <= pos; k++)
                if (ty[b[j][k].first] <= dg[i].t + tx[j] && dg[i].t + tx[j] <= ty[b[j][k].second]) {flag = 1; break;}
            if (flag) sumBC++, uy[++yy] = tx[j] - tx[dg[i].l];
        }
        int bg = lower_bound(ty + 1, ty + m + 1, dg[i].t + tx[dg[i].l]) - ty, ed = lower_bound(ty + 1, ty + m + 1, dg[i].t + tx[dg[i].r]) - ty;
        for (int j = bg; j <= ed; j++)
        {
            int cur = lower_bound(tx + 1, tx + n + 1, ty[j] - dg[i].t) - tx;
            int pos = upper_bound(a[j].begin(), a[j].end(), make_pair(cur, INF)) - a[j].begin() - 1;
            bool flag = 0;
            for (int k = max(0, pos - 2); k <= pos; k++)
                if (tx[a[j][k].first] <= ty[j] - dg[i].t && ty[j] - dg[i].t <= tx[a[j][k].second]) {flag = 1; break;}
            if (flag) sumAC++, ux[++xx] = ty[j] - ty[bg];
        }
        for (int j = 1, k = 0; j <= xx; j++)
        {
            while (k < yy && uy[k + 1] <= ux[j]) k++;
            if (k && uy[k] == ux[j]) sumABC++;
        }
    }
    // cout << sumA << ' ' << sumB << ' ' << sumC << '\n';
    cout << sumA + sumB + sumC - sumAB - sumBC - sumAC + sumABC << '\n';
    return 0;
}

详细

Test #1:

score: 5
Accepted
time: 0ms
memory: 20140kb

input:

1
300 300 300
2 3 211 3 214
2 55 69 55 110
2 41 231 41 243
2 205 220 205 250
2 157 229 157 252
1 176 78 183 78
2 3 94 3 106
1 9 35 9 35
2 47 290 47 297
1 278 93 288 93
2 41 236 41 236
1 194 60 252 60
2 193 188 193 212
2 3 223 3 230
1 79 13 109 13
1 44 34 180 34
2 195 219 195 227
1 118 26 157 26
1 6 ...

output:

6278

result:

ok 1 number(s): "6278"

Test #2:

score: 5
Accepted
time: 0ms
memory: 18032kb

input:

2
300 300 300
2 85 246 85 256
2 65 278 65 296
2 162 161 162 163
2 55 17 55 25
2 100 33 100 35
1 15 190 43 190
2 85 166 85 173
1 39 15 48 15
2 252 1 252 5
1 244 88 250 88
2 162 212 162 213
1 17 187 32 187
2 17 23 17 23
2 85 104 85 113
1 21 297 84 297
1 42 21 77 21
2 202 31 202 56
1 216 211 267 211
1 ...

output:

6200

result:

ok 1 number(s): "6200"

Test #3:

score: 5
Accepted
time: 0ms
memory: 17960kb

input:

3
300 300 300
2 116 224 116 238
2 46 87 46 92
2 28 22 28 31
2 283 56 283 131
2 39 242 39 272
1 231 61 264 61
2 116 69 116 86
1 225 60 281 60
2 189 39 189 160
1 24 298 56 298
2 28 159 28 167
1 246 160 285 160
2 177 93 177 120
2 116 168 116 168
1 281 290 283 290
1 277 136 277 136
2 289 268 289 282
1 1...

output:

6639

result:

ok 1 number(s): "6639"

Test #4:

score: 5
Accepted
time: 0ms
memory: 15988kb

input:

4
300 300 300
2 106 122 106 127
2 11 115 11 136
2 73 109 73 139
2 172 52 172 123
2 265 205 265 242
1 120 292 120 292
2 106 97 106 104
1 60 279 133 279
2 233 51 233 65
1 21 198 24 198
2 73 273 73 281
1 64 159 85 159
2 50 54 50 197
2 106 160 106 168
1 248 54 252 54
1 53 59 61 59
2 131 80 131 80
1 55 2...

output:

7078

result:

ok 1 number(s): "7078"

Test #5:

score: 5
Accepted
time: 2ms
memory: 18024kb

input:

5
300 300 300
2 287 265 287 265
2 111 270 111 297
2 157 17 157 58
2 277 275 277 298
2 15 211 15 211
1 14 30 63 30
2 287 84 287 156
1 253 35 295 35
2 20 190 20 194
1 286 33 286 33
2 157 96 157 98
1 91 39 163 39
2 250 8 250 155
2 287 11 287 11
1 300 251 300 251
1 2 17 25 17
2 277 265 277 298
1 29 220 ...

output:

7125

result:

ok 1 number(s): "7125"

Test #6:

score: 5
Accepted
time: 0ms
memory: 18100kb

input:

6
100000 100000 2000
1 18077 90844 29870 90844
1 15898 25209 29023 25209
2 44675 61077 44675 61413
1 99173 18081 99624 18081
2 14413 11091 14413 11125
1 99340 26474 99814 26474
2 96947 75112 96947 80888
2 66129 52517 66129 54954
1 93237 26027 98206 26027
2 78129 62643 78129 85005
1 58541 25209 58885...

output:

9811536

result:

ok 1 number(s): "9811536"

Test #7:

score: 5
Accepted
time: 3ms
memory: 20208kb

input:

7
100000 100000 2000
1 34031 33382 34054 33382
1 99015 33804 99864 33804
2 34512 3505 34512 4898
1 55048 84217 56238 84217
2 38112 40398 38112 42615
1 50442 65899 51889 65899
2 88157 62617 88157 86041
2 60447 86164 60447 92917
1 65226 27267 76959 27267
2 14212 5626 14212 15791
1 8592 33804 10140 338...

output:

10053021

result:

ok 1 number(s): "10053021"

Test #8:

score: 5
Accepted
time: 3ms
memory: 18104kb

input:

8
100000 100000 2000
1 98275 10296 99977 10296
1 73858 63081 78509 63081
2 13466 55377 13466 56714
1 6243 488 9927 488
2 17152 2176 17152 2450
1 54764 65968 58926 65968
2 44370 73685 44370 75926
2 67096 21518 67096 39914
1 451 9553 481 9553
2 68472 48718 68472 62445
1 4999 63081 8847 63081
2 19270 4...

output:

10332321

result:

ok 1 number(s): "10332321"

Test #9:

score: 5
Accepted
time: 3ms
memory: 18076kb

input:

9
100000 100000 2000
1 23317 23871 31852 23871
1 53872 67865 56553 67865
2 72463 7396 72463 8278
1 1541 6200 3500 6200
2 70353 66810 70353 67517
1 13712 70706 14713 70706
2 61832 48509 61832 67304
2 15946 75070 15946 88595
1 12825 45666 19060 45666
2 69012 9660 69012 11970
1 69321 67865 69955 67865
...

output:

9979747

result:

ok 1 number(s): "9979747"

Test #10:

score: 5
Accepted
time: 53ms
memory: 22864kb

input:

10
100000 100000 100000
1 61835 40902 62028 40902
1 64668 87940 90795 87940
1 61451 55355 61721 55355
1 98743 90394 98811 90394
1 93456 95437 93715 95437
1 178 96457 37434 96457
1 93457 73049 93641 73049
1 19855 25199 20057 25199
1 30835 55620 49371 55620
1 870 22188 35965 22188
1 89651 53076 93078 ...

output:

376451109

result:

ok 1 number(s): "376451109"

Test #11:

score: 5
Accepted
time: 48ms
memory: 21000kb

input:

11
100000 100000 100000
1 93433 32681 94198 32681
1 2415 85702 10653 85702
1 8749 5532 8752 5532
1 4176 3468 7801 3468
1 65135 97514 70898 97514
1 1346 69975 2218 69975
1 7238 53922 7339 53922
1 6680 21587 14606 21587
1 9177 40049 75470 40049
1 2212 26058 49400 26058
1 35015 27905 44587 27905
1 6151...

output:

378527694

result:

ok 1 number(s): "378527694"

Test #12:

score: 5
Accepted
time: 48ms
memory: 18916kb

input:

12
100000 100000 100000
1 644 10293 1177 10293
1 21231 74542 39652 74542
1 43086 28517 43600 28517
1 26256 93913 30489 93913
1 96516 44567 99105 44567
1 61061 42889 82165 42889
1 99983 5181 99987 5181
1 34354 47611 35329 47611
1 9509 65384 12488 65384
1 4173 11791 41138 11791
1 56669 47644 65359 476...

output:

374249547

result:

ok 1 number(s): "374249547"

Test #13:

score: 5
Accepted
time: 52ms
memory: 18860kb

input:

13
100000 100000 100000
1 25010 45828 33332 45828
1 51296 68890 72169 68890
1 78689 23687 78701 23687
1 95867 9382 97806 9382
1 55509 23786 99806 23786
1 40260 60931 44183 60931
1 22221 30731 22226 30731
1 76059 58981 76830 58981
1 7920 60112 15752 60112
1 44688 44084 73628 44084
1 11777 79268 17075...

output:

383211528

result:

ok 1 number(s): "383211528"

Test #14:

score: 5
Accepted
time: 57ms
memory: 22284kb

input:

14
100000 100000 100000
2 80885 49245 80885 49283
2 11220 64102 11220 65000
1 92473 13377 99579 13377
2 80885 86626 80885 86820
2 21118 1259 21118 11985
2 42237 62778 42237 69888
1 97222 79184 98758 79184
2 44599 63597 44599 63713
2 79040 95387 79040 96667
2 69913 88035 69913 88669
2 45307 2924 4530...

output:

381101960

result:

ok 1 number(s): "381101960"

Test #15:

score: 5
Accepted
time: 50ms
memory: 23152kb

input:

15
100000 100000 100000
2 91764 54353 91764 54520
2 28652 49170 28652 49615
1 9331 16798 11503 16798
2 91764 79993 91764 81072
2 84153 26433 84153 32088
2 75533 55981 75533 56009
1 37815 31743 39093 31743
2 6745 3757 6745 3760
2 63642 6258 63642 22771
2 55482 37341 55482 37878
2 81074 74483 81074 88...

output:

382632220

result:

ok 1 number(s): "382632220"

Test #16:

score: 5
Accepted
time: 50ms
memory: 24844kb

input:

16
100000 100000 100000
2 66828 6630 66828 7506
2 62880 34446 62880 43261
1 47672 55311 60293 55311
2 66828 76715 66828 76935
2 363 3447 363 68149
2 63886 41674 63886 55533
1 22133 90250 22411 90250
2 73144 82613 73144 82629
2 29932 19382 29932 22540
2 1995 82720 1995 83239
2 45497 7470 45497 10822
...

output:

380367856

result:

ok 1 number(s): "380367856"

Test #17:

score: 5
Accepted
time: 54ms
memory: 22316kb

input:

17
100000 100000 100000
2 77793 41255 77793 41333
2 5747 28352 5747 35492
1 14185 60840 15523 60840
2 77793 13667 77793 13709
2 29577 61040 29577 86816
2 65419 21908 65419 21909
1 4053 40767 5023 40767
2 5799 75974 5799 75989
2 56279 2793 56279 5116
2 88847 42645 88847 42947
2 26816 5454 26816 29322...

output:

377356031

result:

ok 1 number(s): "377356031"

Test #18:

score: 5
Accepted
time: 59ms
memory: 19808kb

input:

18
100000 100000 100000
2 1268 88808 1268 88885
2 57502 2110 57502 4367
1 41290 26515 47069 26515
2 1268 26818 1268 27021
2 71149 83597 71149 94531
2 10874 27348 10874 27667
1 43190 25771 43495 25771
2 58647 88335 58647 88418
2 79069 10314 79069 79144
2 40298 5896 40298 6940
2 59012 9576 59012 13924...

output:

381702497

result:

ok 1 number(s): "381702497"

Test #19:

score: 5
Accepted
time: 57ms
memory: 20200kb

input:

19
100000 100000 100000
2 89823 49443 89823 49983
2 80228 97306 80228 97895
1 42598 57336 42786 57336
2 89823 77556 89823 77717
2 66932 24494 66932 55405
2 53340 64541 53340 64712
1 60745 97405 69512 97405
2 40429 2913 40429 3039
2 81959 82182 81959 90993
2 8781 67985 8781 68397
2 78315 7314 78315 3...

output:

380715962

result:

ok 1 number(s): "380715962"

Test #20:

score: 5
Accepted
time: 64ms
memory: 22772kb

input:

20
1000000000 1000000000 100000
2 94971842 653040809 94971842 653703458
2 482724716 383575122 482724716 435099343
1 318102608 972959400 378877390 972959400
2 94971842 860758970 94971842 863268182
2 367852389 787409469 367852389 998707870
2 419520406 173007646 419520406 446320624
1 89956469 295257477...

output:

3930560445242

result:

ok 1 number(s): "3930560445242"

Extra Test:

score: 0
Extra Test Passed