답안 #337486

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
337486 2020-12-21T02:12:28 Z thecodingwizard 무지개나라 (APIO17_rainbow) C++11
100 / 100
1740 ms 244368 KB
#include <bits/stdc++.h>
#include "rainbow.h"
using namespace std;

#define ii pair<int, int>
#define f first
#define s second
#define pb push_back
#define mp make_pair
#define all(x) x.begin(), x.end()
#define F0R(i, n) for (int i = 0; i < n; i++)
#define FOR(i, a, b) for (int i = a; i < b; i++)

const int maxn = 2e5+10;
const int maxst = maxn*22*4*10;

int st[maxst], L[maxst], R[maxst], ctr = 0;

struct SegTree {
    map<int, set<int>> points;
    int roots[maxn];
    void add(int r, int c) {
        points[r].insert(c);
    }
    void build() {
        F0R(i, maxn) {
            roots[i] = i==0?0:roots[i-1];
            for (int p : points[i]) {
                update(roots[i], 0, maxn-1, p);
            }
        }
    }
    void update(int &node, int i, int j, int k) {
        st[ctr+1] = st[node];
        L[ctr+1] = L[node];
        R[ctr+1] = R[node];
        node = ctr+1;
        ctr++;

        st[node]++;

        if (i == j) return;

        int m = (i+j)/2;
        if (m >= k) {
            update(L[node], i, m, k);
        } else {
            update(R[node], m+1, j, k);
        }
    }

    int query(int r1, int c1, int r2, int c2) {
        //cout << r1 << " " << c1 << "; " << r2 << " "<< c2 << endl;
        //cout << query(roots[r2], c1, c2, 0, maxn-1) << ", " <<  (r1>0?query(roots[r1-1], c1, c2, 0, maxn-1):0) << endl;
        return query(roots[r2], c1, c2, 0, maxn-1) - (r1>0?query(roots[r1-1], c1, c2, 0, maxn-1):0);
    }

    int query(int node, int l, int r, int i, int j) {
        if (l <= i && j <= r) return st[node];
        if (l > j || r < i) return 0;
        return query(L[node], l, r, i, (i+j)/2) + query(R[node], l, r, (i+j)/2+1, j);
    }
} vertices, edges_horiz, edges_vert, rivers;

int min_r = maxn, min_c = maxn, max_r = 0, max_c = 0;
void addRiver(int r, int c) {
    min_r = min(min_r, r);
    max_r = max(max_r, r);
    min_c = min(min_c, c);
    max_c = max(max_c, c);
    vertices.add(r, c);
    vertices.add(r+1, c);
    vertices.add(r, c+1);
    vertices.add(r+1, c+1);
    edges_horiz.add(r, c);
    edges_horiz.add(r+1, c);
    edges_vert.add(r, c);
    edges_vert.add(r, c+1);
    rivers.add(r, c);
    //cout << "adding " << r << ", " << c << endl;
}

void init(int R, int C, int sr, int sc, int M, char *S) {
    --sr; --sc;
    addRiver(sr, sc);
    F0R(i, M) {
        char c = S[i];
        if (c == 'N') sr--;
        else if (c == 'E') sc++;
        else if (c == 'S') sr++;
        else if (c == 'W') sc--;
        else assert(false);
        addRiver(sr, sc);
    }
    vertices.build();
    edges_horiz.build();
    edges_vert.build();
    rivers.build();
}

int colour(int ar, int ac, int br, int bc) {
    --ar; --ac;
    int riverCt = rivers.query(ar, ac, br-1, bc-1);
    int vertexCt = vertices.query(ar+1, ac+1, br-1, bc-1) + (br-ar-1)*2 + (bc-ac-1)*2 + 4;
    int edgeCt = edges_horiz.query(ar+1, ac, br-1, bc-1) + edges_vert.query(ar, ac+1, br-1, bc-1) + (br-ar)*2 + (bc-ac)*2;
    int connectedComponents = (ar < min_r && br-1 > max_r && ac < min_c && bc-1 > max_c) ? 2 : 1;
    int ans = edgeCt - vertexCt + 1 + connectedComponents - 1 - riverCt;
    //cout << ar << " "<< ac << " " << br << " " << bc << " " << riverCt << " " << vertexCt << " " << edgeCt << " " << connectedComponents << endl;
    return ans;
}

# 결과 실행 시간 메모리 Grader output
1 Correct 223 ms 78956 KB Output is correct
2 Correct 221 ms 79980 KB Output is correct
3 Correct 218 ms 78956 KB Output is correct
4 Correct 215 ms 79084 KB Output is correct
5 Correct 222 ms 80364 KB Output is correct
6 Correct 226 ms 78700 KB Output is correct
7 Correct 217 ms 78572 KB Output is correct
8 Correct 217 ms 78700 KB Output is correct
9 Correct 211 ms 78828 KB Output is correct
10 Correct 217 ms 78700 KB Output is correct
11 Correct 222 ms 79084 KB Output is correct
12 Correct 218 ms 79596 KB Output is correct
13 Correct 223 ms 80748 KB Output is correct
14 Correct 222 ms 81260 KB Output is correct
15 Correct 216 ms 78700 KB Output is correct
16 Correct 214 ms 78700 KB Output is correct
17 Correct 216 ms 78572 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 214 ms 78700 KB Output is correct
2 Correct 216 ms 78572 KB Output is correct
3 Correct 856 ms 177388 KB Output is correct
4 Correct 1155 ms 242156 KB Output is correct
5 Correct 1176 ms 240876 KB Output is correct
6 Correct 1008 ms 204396 KB Output is correct
7 Correct 1118 ms 202220 KB Output is correct
8 Correct 520 ms 82284 KB Output is correct
9 Correct 1154 ms 242156 KB Output is correct
10 Correct 1184 ms 241132 KB Output is correct
11 Correct 1044 ms 204268 KB Output is correct
12 Correct 708 ms 230764 KB Output is correct
13 Correct 744 ms 242028 KB Output is correct
14 Correct 757 ms 240876 KB Output is correct
15 Correct 740 ms 204524 KB Output is correct
16 Correct 933 ms 195308 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 216 ms 78700 KB Output is correct
2 Correct 563 ms 238700 KB Output is correct
3 Correct 534 ms 240876 KB Output is correct
4 Correct 555 ms 238700 KB Output is correct
5 Correct 458 ms 198660 KB Output is correct
6 Correct 335 ms 108780 KB Output is correct
7 Correct 420 ms 138604 KB Output is correct
8 Correct 539 ms 221420 KB Output is correct
9 Correct 538 ms 205548 KB Output is correct
10 Correct 318 ms 110356 KB Output is correct
11 Correct 424 ms 157176 KB Output is correct
12 Correct 562 ms 238848 KB Output is correct
13 Correct 527 ms 240876 KB Output is correct
14 Correct 557 ms 238736 KB Output is correct
15 Correct 465 ms 198624 KB Output is correct
16 Correct 329 ms 102764 KB Output is correct
17 Correct 407 ms 138732 KB Output is correct
18 Correct 538 ms 238700 KB Output is correct
19 Correct 548 ms 239724 KB Output is correct
20 Correct 552 ms 239660 KB Output is correct
21 Correct 562 ms 221428 KB Output is correct
22 Correct 550 ms 205548 KB Output is correct
23 Correct 331 ms 110316 KB Output is correct
24 Correct 427 ms 157164 KB Output is correct
25 Correct 558 ms 238828 KB Output is correct
26 Correct 535 ms 240876 KB Output is correct
27 Correct 547 ms 238700 KB Output is correct
28 Correct 461 ms 198764 KB Output is correct
29 Correct 314 ms 102764 KB Output is correct
30 Correct 402 ms 138732 KB Output is correct
31 Correct 525 ms 238872 KB Output is correct
32 Correct 535 ms 239852 KB Output is correct
33 Correct 532 ms 239692 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 223 ms 78956 KB Output is correct
2 Correct 221 ms 79980 KB Output is correct
3 Correct 218 ms 78956 KB Output is correct
4 Correct 215 ms 79084 KB Output is correct
5 Correct 222 ms 80364 KB Output is correct
6 Correct 226 ms 78700 KB Output is correct
7 Correct 217 ms 78572 KB Output is correct
8 Correct 217 ms 78700 KB Output is correct
9 Correct 211 ms 78828 KB Output is correct
10 Correct 217 ms 78700 KB Output is correct
11 Correct 222 ms 79084 KB Output is correct
12 Correct 218 ms 79596 KB Output is correct
13 Correct 223 ms 80748 KB Output is correct
14 Correct 222 ms 81260 KB Output is correct
15 Correct 216 ms 78700 KB Output is correct
16 Correct 214 ms 78700 KB Output is correct
17 Correct 216 ms 78572 KB Output is correct
18 Correct 1404 ms 162888 KB Output is correct
19 Correct 551 ms 85868 KB Output is correct
20 Correct 452 ms 82668 KB Output is correct
21 Correct 496 ms 83564 KB Output is correct
22 Correct 506 ms 84208 KB Output is correct
23 Correct 530 ms 85624 KB Output is correct
24 Correct 472 ms 83276 KB Output is correct
25 Correct 494 ms 84076 KB Output is correct
26 Correct 502 ms 84460 KB Output is correct
27 Correct 799 ms 147564 KB Output is correct
28 Correct 685 ms 113644 KB Output is correct
29 Correct 794 ms 141932 KB Output is correct
30 Correct 1051 ms 242284 KB Output is correct
31 Correct 225 ms 78828 KB Output is correct
32 Correct 1125 ms 148588 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 223 ms 78956 KB Output is correct
2 Correct 221 ms 79980 KB Output is correct
3 Correct 218 ms 78956 KB Output is correct
4 Correct 215 ms 79084 KB Output is correct
5 Correct 222 ms 80364 KB Output is correct
6 Correct 226 ms 78700 KB Output is correct
7 Correct 217 ms 78572 KB Output is correct
8 Correct 217 ms 78700 KB Output is correct
9 Correct 211 ms 78828 KB Output is correct
10 Correct 217 ms 78700 KB Output is correct
11 Correct 222 ms 79084 KB Output is correct
12 Correct 218 ms 79596 KB Output is correct
13 Correct 223 ms 80748 KB Output is correct
14 Correct 222 ms 81260 KB Output is correct
15 Correct 216 ms 78700 KB Output is correct
16 Correct 214 ms 78700 KB Output is correct
17 Correct 216 ms 78572 KB Output is correct
18 Correct 1404 ms 162888 KB Output is correct
19 Correct 551 ms 85868 KB Output is correct
20 Correct 452 ms 82668 KB Output is correct
21 Correct 496 ms 83564 KB Output is correct
22 Correct 506 ms 84208 KB Output is correct
23 Correct 530 ms 85624 KB Output is correct
24 Correct 472 ms 83276 KB Output is correct
25 Correct 494 ms 84076 KB Output is correct
26 Correct 502 ms 84460 KB Output is correct
27 Correct 799 ms 147564 KB Output is correct
28 Correct 685 ms 113644 KB Output is correct
29 Correct 794 ms 141932 KB Output is correct
30 Correct 1051 ms 242284 KB Output is correct
31 Correct 225 ms 78828 KB Output is correct
32 Correct 1125 ms 148588 KB Output is correct
33 Correct 563 ms 238700 KB Output is correct
34 Correct 534 ms 240876 KB Output is correct
35 Correct 555 ms 238700 KB Output is correct
36 Correct 458 ms 198660 KB Output is correct
37 Correct 335 ms 108780 KB Output is correct
38 Correct 420 ms 138604 KB Output is correct
39 Correct 539 ms 221420 KB Output is correct
40 Correct 538 ms 205548 KB Output is correct
41 Correct 318 ms 110356 KB Output is correct
42 Correct 424 ms 157176 KB Output is correct
43 Correct 562 ms 238848 KB Output is correct
44 Correct 527 ms 240876 KB Output is correct
45 Correct 557 ms 238736 KB Output is correct
46 Correct 465 ms 198624 KB Output is correct
47 Correct 329 ms 102764 KB Output is correct
48 Correct 407 ms 138732 KB Output is correct
49 Correct 538 ms 238700 KB Output is correct
50 Correct 548 ms 239724 KB Output is correct
51 Correct 552 ms 239660 KB Output is correct
52 Correct 562 ms 221428 KB Output is correct
53 Correct 550 ms 205548 KB Output is correct
54 Correct 331 ms 110316 KB Output is correct
55 Correct 427 ms 157164 KB Output is correct
56 Correct 558 ms 238828 KB Output is correct
57 Correct 535 ms 240876 KB Output is correct
58 Correct 547 ms 238700 KB Output is correct
59 Correct 461 ms 198764 KB Output is correct
60 Correct 314 ms 102764 KB Output is correct
61 Correct 402 ms 138732 KB Output is correct
62 Correct 525 ms 238872 KB Output is correct
63 Correct 535 ms 239852 KB Output is correct
64 Correct 532 ms 239692 KB Output is correct
65 Correct 1672 ms 225004 KB Output is correct
66 Correct 1740 ms 209004 KB Output is correct
67 Correct 859 ms 113856 KB Output is correct
68 Correct 933 ms 160876 KB Output is correct
69 Correct 1179 ms 242300 KB Output is correct
70 Correct 1082 ms 244368 KB Output is correct
71 Correct 1052 ms 242328 KB Output is correct
72 Correct 933 ms 202348 KB Output is correct
73 Correct 712 ms 106348 KB Output is correct
74 Correct 831 ms 142188 KB Output is correct
75 Correct 922 ms 242284 KB Output is correct
76 Correct 1155 ms 243528 KB Output is correct
77 Correct 993 ms 243308 KB Output is correct
78 Correct 856 ms 177388 KB Output is correct
79 Correct 1155 ms 242156 KB Output is correct
80 Correct 1176 ms 240876 KB Output is correct
81 Correct 1008 ms 204396 KB Output is correct
82 Correct 1118 ms 202220 KB Output is correct
83 Correct 520 ms 82284 KB Output is correct
84 Correct 1154 ms 242156 KB Output is correct
85 Correct 1184 ms 241132 KB Output is correct
86 Correct 1044 ms 204268 KB Output is correct
87 Correct 708 ms 230764 KB Output is correct
88 Correct 744 ms 242028 KB Output is correct
89 Correct 757 ms 240876 KB Output is correct
90 Correct 740 ms 204524 KB Output is correct
91 Correct 933 ms 195308 KB Output is correct