Submission #986418

#TimeUsernameProblemLanguageResultExecution timeMemory
986418PyqeKeys (IOI21_keys)C++17
100 / 100
955 ms403600 KiB
#include <bits/stdc++.h> using namespace std; #define mp make_pair #define fr first #define sc second const long long inf=1e18; long long n,m,nm=0,a[300069],dsu[300069],cc[300069],dh[300069],mdh[300069],vtd2[300069],cc2[300069]; multiset<long long> ms[300069]; multiset<pair<long long,long long>> el[300069]; queue<long long> al[300069]; bitset<300069> vtd,spc; pair<long long,long long> ed[600069]; long long fd(long long x) { if(dsu[x]!=x) { dsu[x]=fd(dsu[x]); } return dsu[x]; } inline void jo(long long x,long long y) { long long k,l; multiset<long long>::iterator it; multiset<pair<long long,long long>>::iterator it2; x=fd(x); y=fd(y); if(cc[y]>cc[x]) { swap(x,y); } mdh[x]=min(mdh[x],mdh[y]); vtd2[x]+=vtd2[y]; for(it=ms[y].begin();it!=ms[y].end();it++) { k=*it; for(it2=el[x].lower_bound({k,0});it2!=el[x].end()&&it2->fr==k;) { al[x].push(it2->sc); it2++; el[x].erase(prev(it2)); } ms[x].insert(k); } for(it2=el[y].begin();it2!=el[y].end();it2++) { k=it2->fr; l=it2->sc; if(ms[x].find(k)==ms[x].end()) { el[x].insert(*it2); } else { al[x].push(l); } } for(;!al[y].empty();al[y].pop()) { al[x].push(al[y].front()); } cc[x]+=cc[y]; dsu[y]=x; } void scc(long long x) { long long l; vtd[x]=1; vtd2[x]++; mdh[x]=dh[x]; for(;!al[fd(x)].empty();) { l=al[fd(x)].front(); al[fd(x)].pop(); nm++; ed[nm]={x,l}; if(!vtd[l]) { dh[l]=dh[x]+1; scc(l); } if(vtd2[fd(l)]&&mdh[fd(l)]<mdh[fd(x)]) { jo(x,l); } } vtd2[fd(x)]--; } vector<int> find_reachable(vector<int> oa,vector<int> ka,vector<int> la,vector<int> wg) { long long i,ii,k,l,w,mn=inf,z; vector<int> v; n=oa.size(); for(i=1;i<=n;i++) { a[i]=oa[i-1]+1; dsu[i]=i; cc[i]=1; ms[i].insert(a[i]); } m=ka.size(); for(i=0;i<m;i++) { k=ka[i]+1; l=la[i]+1; w=wg[i]+1; for(ii=0;ii<2;ii++) { if(a[k]!=w) { el[k].insert({w,l}); } else { al[k].push(l); } cc[k]++; swap(k,l); } } for(i=1;i<=n;i++) { if(!vtd[i]) { dh[i]=0; scc(i); } } for(i=1;i<=nm;i++) { k=ed[i].fr; l=ed[i].sc; if(fd(k)!=fd(l)) { spc[fd(k)]=1; } } for(i=1;i<=n;i++) { cc2[fd(i)]++; } for(i=1;i<=n;i++) { if(fd(i)==i&&!spc[i]) { mn=min(mn,cc2[i]); } } for(i=1;i<=n;i++) { z=cc2[fd(i)]==mn&&!spc[fd(i)]; v.push_back(z); } return v; }
#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...