제출 #986403

#제출 시각아이디문제언어결과실행 시간메모리
986403PyqeSplit the Attractions (IOI19_split)C++17
100 / 100
364 ms86728 KiB
#include <bits/stdc++.h> #include "split.h" using namespace std; #define mp make_pair #define fr first #define sc second long long n,m,ttl=0,nn=0,dsu[200069],dh[100069],pg[100069],sbt[300069],wg[100069],pr[100069],fh[100069],ca[100069],sq[100069]; pair<long long,long long> d[3],mdh[100069]; vector<pair<long long,long long>> al[100069]; bitset<300069> vtd; bitset<100069> vtd2,spc; vector<long long> al2[300069],sbl[300069],al3[100069]; multiset<long long> ms[100069]; bool bad=0,r0=0; long long fd(long long x) { if(dsu[x]!=x) { dsu[x]=fd(dsu[x]); } return dsu[x]; } void bct(long long x,long long b4) { long long i,sz=al[x].size(),l,p; vtd[x]=1; vtd2[x]=1; mdh[x]={dh[x],-1}; for(i=0;i<sz;i++) { l=al[x][i].fr; p=al[x][i].sc; if(p==b4) { continue; } if(!vtd[l]) { dh[l]=dh[x]+1; pg[x]=p; bct(l,p); } if(vtd2[l]) { dsu[fd(p)]=fd(pg[l]); mdh[x]=min(mdh[x],{dh[l],p}); } else if(mdh[l].fr<=dh[x]) { dsu[fd(p)]=fd(mdh[l].sc); mdh[x]=min(mdh[x],{mdh[l].fr,p}); } } vtd2[x]=0; } void bd(long long x) { long long i,sz=al2[x].size(),l,e=-1; vtd[x]=1; sbt[x]=x<n; for(i=0;i<sz;i++) { l=al2[x][i]; if(!vtd[l]) { bd(l); sbt[x]+=sbt[l]; } else { e=l; } } for(i=0;i<sz;i++) { l=al2[x][i]; if(l!=e) { sbl[x].push_back(sbt[l]); } else { sbl[x].push_back(n-sbt[x]); } } } void trv(long long x,long long xx) { long long i,sz=al[x].size(),l; vtd[x]=1; if(d[xx].fr) { sq[x]=d[xx].sc; d[xx].fr--; } for(i=0;i<sz;i++) { l=al[x][i].fr; if((!wg[l]||spc[l]==spc[x])&&!vtd[l]) { trv(l,xx); } } } void dbd(long long x,long long b4) { long long i,sz=al[x].size(),l,p,mn=dh[x]; vtd[x]=1; vtd2[x]=1; fh[x]=dh[x]; for(i=0;i<sz;i++) { l=al[x][i].fr; p=al[x][i].sc; if(p==b4) { continue; } if(wg[l]) { if(!vtd[l]) { dh[l]=dh[x]+1; pr[l]=x; dbd(l,p); fh[x]=min(fh[x],fh[l]); al3[x].push_back(l); ms[x].insert(fh[l]); } else if(vtd2[l]) { fh[x]=min(fh[x],dh[l]); al3[l].push_back(x); mn=min(mn,dh[l]); } } } vtd2[x]=0; ms[x].insert(mn); } bool cmp(long long x,long long y) { return dh[x]>dh[y]; } void dtrv(long long x) { long long i,sz=al3[x].size(),l; vtd[x]=1; ttl+=wg[x]; spc[x]=1; if(ttl>=d[0].fr) { r0=1; return; } nn++; ca[nn]=x; sort(al3[x].begin(),al3[x].end(),cmp); for(i=0;i<sz;i++) { l=al3[x][i]; if(!vtd[l]&&(fh[l]>=dh[x]||dh[l]==dh[x]+1)) { dtrv(l); if(r0) { return; } } } nn--; if(pr[x]+1) { ms[pr[x]].erase(ms[pr[x]].find(fh[x])); if(!vtd[pr[x]]&&(!nn||*ms[pr[x]].begin()>dh[ca[nn]])) { dtrv(pr[x]); } } } vector<int> find_split(int on,int od,int od2,int od3,vector<int> ka,vector<int> la) { long long i,j,ii,l,w,sz,p,e; vector<long long> v; vector<int> v2; n=on; d[0]={od,1}; d[1]={od2,2}; d[2]={od3,3}; sort(d,d+3); m=ka.size(); for(i=0;i<m;i++) { al[ka[i]].push_back({la[i],i}); al[la[i]].push_back({ka[i],i}); dsu[i]=i; } bct(0,-1); for(i=0;i<m;i++) { for(ii=0;ii<2;ii++) { al2[ka[i]].push_back(n+fd(i)); al2[n+fd(i)].push_back(ka[i]); swap(ka[i],la[i]); } } for(i=0;i<n+m;i++) { sort(al2[i].begin(),al2[i].end()); v.clear(); sz=al2[i].size(); for(j=0;j<sz;j++) { l=al2[i][j]; if(!j||l!=al2[i][j-1]) { v.push_back(l); } } al2[i]=v; } vtd.reset(); bd(0); for(i=n;i<n+m;i++) { sz=al2[i].size(); for(j=0;j<sz;j++) { l=al2[i][j]; w=sbl[i][j]; for(ii=0;ii<2;ii++) { if(w>=d[ii].fr&&n-w>=d[!ii].fr) { p=l; e=ii; break; } } if(ii<2) { break; } } if(j<sz) { vtd.reset(); for(j=0;j<sz;j++) { l=al2[i][j]; vtd[l]=l!=p; } trv(p,e); vtd.reset(); vtd[p]=1; trv(al2[i][al2[i][0]==p],!e); bad=1; break; } } if(!bad) { for(i=n;i<n+m;i++) { if(fd(i-n)==i-n) { sz=al2[i].size(); for(j=0;j<sz;j++) { w=sbl[i][j]; if(n-w<d[1].fr) { break; } } if(j>=sz) { for(j=0;j<sz;j++) { l=al2[i][j]; w=sbl[i][j]; wg[l]=w; } vtd.reset(); dh[l]=0; pr[l]=-1; dbd(l,-1); vtd.reset(); dtrv(al3[l][al3[l].size()-1]); e=ttl<d[0].fr||n-ttl<d[1].fr; vtd.reset(); for(ii=0;ii<2;ii++) { for(j=0;j<sz;j++) { l=al2[i][j]; if(spc[l]==!ii) { trv(l,ii^e); break; } } } bad=1; break; } } } } for(i=0;i<n;i++) { if(bad&&!sq[i]) { sq[i]=d[2].sc; } v2.push_back(sq[i]); } return v2; }
#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...