Submission #486901
Source Code Expand
/* * d.cc: D: */ #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<iostream> #include<string> #include<vector> #include<map> #include<set> #include<stack> #include<list> #include<queue> #include<deque> #include<algorithm> #include<numeric> #include<utility> #include<complex> #include<functional> using namespace std; /* constant */ const int MAX_N = 100000; const int MAX_M = 100000; const int MAX_K = 100000; /* typedef */ struct UFT { int links[MAX_N], ranks[MAX_N], sizes[MAX_N]; UFT() {} void clear(int n) { for (int i = 0; i < n; i++) links[i] = i, ranks[i] = sizes[i] = 1; } int root(int i) { int i0 = i; while (links[i0] != i0) i0 = links[i0]; return (links[i] = i0); } int rank(int i) { return ranks[root(i)]; } int size(int i) { return sizes[root(i)]; } bool same(int i, int j) { return root(i) == root(j); } int merge(int i0, int i1) { int r0 = root(i0), r1 = root(i1); int mr; if (ranks[r0] == ranks[r1]) { links[r1] = r0; sizes[r0] += sizes[r1]; ranks[r0]++; mr = r0; } else if (ranks[r0] > ranks[r1]) { links[r1] = r0; sizes[r0] += sizes[r1]; mr = r0; } else { links[r0] = r1; sizes[r1] += sizes[r0]; mr = r1; } return mr; } }; struct Edge { int a, b; bool f; }; struct Query { int op, a, b; }; /* global variables */ UFT uft; Edge es[MAX_M]; Query qs[MAX_K]; stack<bool> ans; /* subroutines */ /* main */ int main() { int n, m, k; cin >> n >> m >> k; for (int i = 0; i < m; i++) { cin >> es[i].a >> es[i].b; es[i].a--, es[i].b--, es[i].f = true; } for (int i = 0; i < k; i++) { cin >> qs[i].op; if (qs[i].op == 0) { int j; cin >> j; j--; qs[i].a = es[j].a; qs[i].b = es[j].b; es[j].f = false; } else { cin >> qs[i].a >> qs[i].b; qs[i].a--, qs[i].b--; } } uft.clear(n); for (int i = 0; i < m; i++) if (es[i].f) { int ra = uft.root(es[i].a); int rb = uft.root(es[i].b); if (ra != rb) uft.merge(ra, rb); } for (int i = k - 1; i >= 0; i--) { int ra = uft.root(qs[i].a); int rb = uft.root(qs[i].b); if (qs[i].op == 0) { if (ra != rb) uft.merge(ra, rb); } else { ans.push(ra == rb); } } while (! ans.empty()) { bool f = ans.top(); ans.pop(); cout << (f ? "YES" : "NO") << endl; } return 0; }
Submission Info
Submission Time | |
---|---|
Task | D - Graph Destruction |
User | tnakao |
Language | C++ (GCC 4.4.7) |
Score | 100 |
Code Size | 2628 Byte |
Status | AC |
Exec Time | 454 ms |
Memory | 5372 KB |
Judge Result
Set Name | All | ||
---|---|---|---|
Score / Max Score | 100 / 100 | ||
Status |
|
Set Name | Test Cases |
---|---|
All | 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 3, 30, 31, 32, 33, 34, 35, 36, 4, 5, 50, 6, 7, 8, 9 |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
1 | AC | 39 ms | 1744 KB |
10 | AC | 44 ms | 1764 KB |
11 | AC | 74 ms | 2044 KB |
12 | AC | 148 ms | 2424 KB |
13 | AC | 245 ms | 2928 KB |
14 | AC | 350 ms | 3448 KB |
15 | AC | 403 ms | 4476 KB |
16 | AC | 454 ms | 5372 KB |
17 | AC | 146 ms | 2552 KB |
18 | AC | 138 ms | 2552 KB |
19 | AC | 176 ms | 2808 KB |
2 | AC | 34 ms | 1784 KB |
20 | AC | 231 ms | 3192 KB |
21 | AC | 177 ms | 2808 KB |
22 | AC | 319 ms | 3148 KB |
23 | AC | 175 ms | 2812 KB |
24 | AC | 259 ms | 2512 KB |
25 | AC | 139 ms | 2556 KB |
26 | AC | 337 ms | 3832 KB |
27 | AC | 121 ms | 2428 KB |
28 | AC | 133 ms | 2424 KB |
29 | AC | 268 ms | 3316 KB |
3 | AC | 35 ms | 1912 KB |
30 | AC | 198 ms | 2936 KB |
31 | AC | 321 ms | 3708 KB |
32 | AC | 262 ms | 3320 KB |
33 | AC | 283 ms | 3448 KB |
34 | AC | 343 ms | 3836 KB |
35 | AC | 303 ms | 3572 KB |
36 | AC | 158 ms | 2684 KB |
4 | AC | 35 ms | 1784 KB |
5 | AC | 35 ms | 1784 KB |
50 | AC | 319 ms | 3700 KB |
6 | AC | 33 ms | 1784 KB |
7 | AC | 36 ms | 1788 KB |
8 | AC | 37 ms | 1788 KB |
9 | AC | 38 ms | 1784 KB |