Submission #604887

#TimeUsernameProblemLanguageResultExecution timeMemory
604887CSQ31ICC (CEOI16_icc)C++17
61 / 100
226 ms496 KiB
#include <bits/stdc++.h> #include "icc.h" using namespace std; int par[1000]; int find(int x){ if(x==par[x])return x; return par[x] = find(par[x]); } void unite(int a,int b){ a = find(a); b = find(b); if(a==b)return; par[a] = b; } int n; int A[200],B[200],an,bn; mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); /* int query(int a, int b, int *A, int *B){ int ans; for(int i=0;i<a;i++)cout<<A[i]<<" "; cout<<'\n'; for(int i=0;i<b;i++)cout<<B[i]<<" "; cout<<'\n'; cin>>ans; return ans; } void setRoad(int a, int b){ cout<<"added edge"<<'\n'; cout<<a<<" "<<b<<'\n'; }*/ void run(int N){ n = N; for(int i=1;i<=n;i++)par[i] = i; for(int i=1;i<n;i++){ vector<int>g; vector<vector<int>>p(n+1); for(int j=1;j<=n;j++){ if(j==find(j))g.push_back(j); p[find(j)].push_back(j); } while(true){ int m = g.size(); vector<int>f,s; for(int i=0;i<m;i++){ if(uniform_int_distribution<int>(0,1)(rng))f.push_back(g[i]); else s.push_back(g[i]); } int ptr = 0; for(int y:f){ for(int x:p[y])A[ptr++] = x; } an = ptr; bn = n-ptr; ptr = 0; for(int y:s){ for(int x:p[y])B[ptr++] = x; } if(query(an,bn,A,B))break; } int cnt = 0; int l = 1,r = an; while(r>l){ int mid = (l+r)/2; if(query(mid,bn,A,B))r = mid; else l = mid+1; cnt++; } int v = A[r-1]; l = 1; r = bn; while(r>l){ int mid = (l+r)/2; if(query(an,mid,A,B))r = mid; else l = mid+1; cnt++; } assert(cnt<=14); int u = B[r-1]; unite(v,u); setRoad(v,u); } } /* int main() { int m; cin>>m; run(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...