제출 #580673

#제출 시각아이디문제언어결과실행 시간메모리
580673andrei_boacaICC (CEOI16_icc)C++14
61 / 100
211 ms588 KiB
#include <bits/stdc++.h> #include "icc.h" using namespace std; mt19937 rng(time(NULL)); int n; vector<int> dsu[105]; int comp[105],a[105],b[105],asize,bsize,A[105],old[105]; int comps[105][105],vals[105]; void dsu_merge(int c1,int c2) { if(dsu[c1].size()<dsu[c2].size()) swap(c1,c2); for(int i:dsu[c2]) { comp[i]=c1; dsu[c1].push_back(i); } dsu[c2].clear(); } int adj[105][105]; /*int query(int asize,int bsize, int v[105],int w[105]) { for(int i=0;i<asize;i++) for(int j=0;j<bsize;j++) if(adj[v[i]][w[j]]) return 1; return 0; } void setRoad(int x,int y) { cout<<x<<' '<<y<<'\n'; adj[x][y]=adj[y][x]=1; }*/ void run(int N) { n=N; for(int i=1;i<=n;i++) { dsu[i].push_back(i); comp[i]=i; } int p=0; int nr=n; for(int z=1;z<n;z++,nr--) { int cnt=0; /*int h,e; cin>>h>>e; adj[h][e]=adj[e][h]=1;*/ for(int i=1;i<=n;i++) if(dsu[i].size()) { cnt++; for(int j:dsu[i]) comp[j]=cnt; dsu[cnt]=dsu[i]; if(i!=cnt) dsu[i].clear(); } for(int i=1;i<=cnt;i++) vals[i]=i; int mid=(cnt+1)/2; bool rev=0; while(true) { asize=0; for(int i=1;i<=mid;i++) for(int q:dsu[vals[i]]) a[asize++]=q; bsize=0; for(int i=mid+1;i<=cnt;i++) for(int q:dsu[vals[i]]) b[bsize++]=q; if(query(asize,bsize,a,b)) break; if(cnt<=50) { shuffle(vals+1,vals+cnt+1,rng); continue; } vector<int> cand; for(int i=1;i<=cnt;i++) { old[i]=vals[i]; vals[i]=0; } int poz=cnt-50; for(int j=cnt-49;j<=cnt;j++) cand.push_back(old[j]); for(int i=1;i<=cnt;i++) { shuffle(cand.begin(),cand.end(),rng); vals[i]=cand.back(); cand.pop_back(); if(poz>0) { cand.push_back(old[poz]); poz--; } } } int st=0; int dr=asize-1; int x=0; while(st<=dr) { int mij=(st+dr)/2; int sza=0; for(int i=0;i<=mij;i++) A[sza++]=a[i]; int ans=query(sza,bsize,A,b); if(ans==1) { x=a[mij]; dr=mij-1; } else st=mij+1; } st=0; dr=bsize-1; int y=0; while(st<=dr) { int mij=(st+dr)/2; int sza=0; for(int i=0;i<=mij;i++) A[sza++]=b[i]; int ans=query(sza,asize,A,a); if(ans==1) { y=b[mij]; dr=mij-1; } else st=mij+1; } dsu_merge(comp[x],comp[y]); setRoad(x,y); } } /*int main() { int N; cin>>N; run(N); }*/

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

icc.cpp: In function 'void run(int)':
icc.cpp:63:14: warning: unused variable 'rev' [-Wunused-variable]
   63 |         bool rev=0;
      |              ^~~
icc.cpp:42:9: warning: unused variable 'p' [-Wunused-variable]
   42 |     int p=0;
      |         ^
#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...