제출 #307081

#제출 시각아이디문제언어결과실행 시간메모리
307081jungsnowICC (CEOI16_icc)C++14
0 / 100
147 ms632 KiB
#include<bits/stdc++.h> #include "icc.h" #define bug(x) cerr<<#x<<" = "<<x<<endl using namespace std; const int N = 105; int par[N]; vector<int> vec[N]; int find(int u) { return (par[u] == u) ? u : par[u] = find(par[u]); } void join(int u, int v) { u = find(u), v = find(v); if (vec[u].size() > vec[v].size()) swap(u, v); for (auto i : vec[u]) vec[v].push_back(i); par[u] = v, vec[u].clear(); } bool query(vector<int> a, vector<int> b) { int sza = a.size(), szb = b.size(); if (sza == 0 || szb == 0) return 0; int A[N], B[N]; for (int i = 0; i < sza; ++i) A[i] = a[i]; for (int i = 0; i < szb; ++i) B[i] = b[i]; return query(sza, szb, A, B); } void find(int l, int r, vector<int> &go, vector<int>& to) { if (l == r) { int tmp = go[l]; go.clear(); go.push_back(tmp); return; } int mid = (l + r) >> 1; vector<int> a, b; b = to; for (int i = l; i <= mid; ++i) a.push_back(go[i]); if (query(a, b)) find(l, mid, go, to); else find(mid + 1, r, go, to); } void cal(vector<int> vx, vector<int> vy) { find(0, vx.size() - 1, vx, vy); find(0, vy.size() - 1, vy, vx); setRoad(vx[0], vy[0]), join(vx[0], vy[0]); } void run(int n) { for (int i = 1; i <= n; ++i) par[i] = i, vec[i].push_back(i); while (1) { vector<int> go; for (int i = 1; i <= n; ++i) if (find(i) == i) go.push_back(i); int sz = go.size(), m = 0, id = -1, A = 0, B = 0; /// m = A xor B for (int i = 0; (1 << i) < sz; ++i) { vector<int> a, b; for (int j = 0; j < sz; ++j) { if (j >> i & 1) { for (int k : vec[go[j]]) a.push_back(k); } else { for (int k : vec[go[j]]) b.push_back(k); } } if (query(a, b)) m |= (1 << i), id = i; } if (id != -1) B |= (1 << id); for (int i = 0; (1 << i) < sz; ++i) if (i != id) { vector<int> a, b; if (m >> i & 1) { for (int j = 0; j < sz; ++j) { if (((j >> i) & 1) == 0) if (((j >> id) & 1) == 0) { a.push_back(j); } if (((j >> i) & 1) == 1) if (((j >> id) & 1) == 1) { b.push_back(j); } } if (query(a, b)) { B |= (1 << i); } else A |= (1 << i); } else { /// same for (int j = 0; j < sz; ++j) if (((j >> i) & 1) == 0) { if (j >> id & 1) { for (int k : vec[go[j]]) a.push_back(k); } else { for (int k : vec[go[j]]) b.push_back(k); } } if (query(a, b) == 0) { A |= (1 << i); B |= (1 << i); } } } assert(A ^ B == m); cal(vec[go[A]], vec[go[B]]); } }

컴파일 시 표준 에러 (stderr) 메시지

In file included from /usr/include/c++/9/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/9/bits/stdc++.h:33,
                 from icc.cpp:1:
icc.cpp: In function 'void run(int)':
icc.cpp:97:22: warning: suggest parentheses around comparison in operand of '^' [-Wparentheses]
   97 |         assert(A ^ B == m);
      |                    ~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...