Submission #1145330

#TimeUsernameProblemLanguageResultExecution timeMemory
1145330nathan4690ICC (CEOI16_icc)C++20
100 / 100
114 ms620 KiB
// ceoi16p1 - ICC #include <bits/stdc++.h> #include "icc.h" using namespace std; struct DSU{ int n; vector<int> p,sz; DSU(){}; DSU(int n): n(n), p(n+1, 0), sz(n+1, 1){ for(int i=1;i<=n;i++) p[i] = i; } int find_set(int u){ return (u == p[u] ? u : p[u] = find_set(p[u])); } void union_set(int u, int v){ u = find_set(u); v = find_set(v); if(u == v) return; if(sz[u] < sz[v]) swap(u, v); p[v] = u; sz[u] += sz[v]; } }; void run(int N){ DSU dsu = DSU(N); mt19937 rng(998244353); for(int eee=1;eee<N;eee++){ int sza, szb, a[N], b[N]; vector<int> col(N+1, 0); vector<int> comp; for(int i=1;i<=N;i++){ if(dsu.find_set(i) == i){ comp.push_back(i); } } shuffle(comp.begin(), comp.end(), rng); for(int j=0;j<=7;j++){ for(int i=0;i<comp.size();i++){ col[comp[i]] = i >> j & 1; } sza = 0; szb = 0; for(int i=1;i<=N;i++){ if(col[dsu.find_set(i)]){ b[szb++] = i; }else{ a[sza++] = i; } } if(query(sza, szb, a, b)) break; } shuffle(a, a+sza, rng); shuffle(b, b+szb, rng); int L = 1, R = sza; while(L < R){ int mid = (L + R) / 2; if(query(mid, szb, a, b)) R = mid; else L = mid + 1; } int u = a[L-1]; L = 1; R = szb; while(L < R){ int mid = (L + R) / 2; if(query(sza, mid, a, b)) R = mid; else L = mid + 1; } int v = b[L-1]; dsu.union_set(u, v); setRoad(u, v); } } #ifdef LOCAL int main(){ run(StartLocalTest()); cout << "query() called " << QUERY_CALL << " times\n"; } #endif // LOCAL
#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...