Submission #604996

#TimeUsernameProblemLanguageResultExecution timeMemory
604996SlavicGICC (CEOI16_icc)C++17
90 / 100
171 ms524 KiB
#include "icc.h" #include <bits/stdc++.h> using namespace std; /* int query(int a, int b, int* aa, int* bb) { } */ mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int query(vector<int> a, vector<int> b) { int aa[(int)a.size()], bb[(int)b.size()]; for(int i = 0; i < (int)a.size(); ++i) aa[i] = a[i]; for(int i = 0; i < (int)b.size(); ++i) bb[i] = b[i]; return query(a.size(), b.size(), aa, bb); } struct dsu { vector<int> p; dsu(int n) { p.resize(n); iota(p.begin(), p.end(), 0); } int get(int a) {return p[a] = (p[a] == a ? a : get(p[a]));} void uni(int a, int b) { a = get(a); b = get(b); if(rng() & 1) swap(a, b); p[a] = b; } }; void run(int n) { dsu d(n + 5); for(int times = 0; times < n - 1; ++times) { int st = -1; vector<int> v; for(int i = 1; i <= n; ++i) v.push_back(d.get(i)); sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end()); vector<int> A, B; vector<int> bits; for(int bit = 0; (1 << bit) < n; ++bit) bits.push_back(bit); shuffle(bits.begin(), bits.end(), rng); for(int bit: bits) { vector<int> c1, c2; for(int i = 1; i <= n; ++i) { if((d.get(i) - 1) & (1 << bit)) c1.push_back(i); else c2.push_back(i); } if(c1.empty() || c2.empty()) continue; if(query(c1, c2)) { A = c1, B = c2; break; } } assert(A.size() > 0 && B.size() > 0); shuffle(A.begin(), A.end(), rng); shuffle(B.begin(), B.end(), rng); int ansA = -1, ansB = -1; int l = 0, r = (int)A.size() - 1; while(l <= r) { int mid = l + r >> 1; vector<int> paiu; for(int i = 0; i <= mid; ++i) paiu.push_back(A[i]); if(query(paiu, B)) { ansA = A[mid]; r = mid - 1; } else l = mid + 1; } l = 0, r = (int)B.size() - 1; while(l <= r) { int mid = l + r >> 1; vector<int> paiu; for(int i = 0; i <= mid; ++i) paiu.push_back(B[i]); if(query(paiu, A)) { ansB = B[mid]; r = mid - 1; } else l = mid + 1; } assert(ansA != -1 && ansB != -1); d.uni(ansA, ansB); setRoad(ansA, ansB); } } /* int main() { int n; cin >> n; run(n); } */

Compilation message (stderr)

icc.cpp: In function 'void run(int)':
icc.cpp:64:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   64 |             int mid = l + r >> 1;
      |                       ~~^~~
icc.cpp:74:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   74 |             int mid = l + r >> 1;
      |                       ~~^~~
icc.cpp:37:13: warning: unused variable 'st' [-Wunused-variable]
   37 |         int st = -1;
      |             ^~
#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...