Submission #1035651

#TimeUsernameProblemLanguageResultExecution timeMemory
1035651WarinchaiParachute rings (IOI12_rings)C++14
37 / 100
1389 ms253888 KiB
#include<bits/stdc++.h> using namespace std; int N; set<int>s[2000005]; int cur=0; int p[1000005]; int in[1000005]; int vis[1000005]; int tvis[1000005]; int cycle=0; int from[1000005]; int fp(int a){return p[a]==a?a:p[a]=fp(p[a]);} void un(int a,int b){p[fp(b)]=fp(a);} vector<int>adj[1000005]; void Init(int N_) { N = N_; for(int i=0;i<N;i++)from[i]=-1,s[0].insert(i),p[i]=i; } void add(vector<int>v){ cur++; for(auto x:v){ if(s[cur-1].count(x))s[cur-1].erase(x),s[cur].insert(x); } //cerr<<s[cur].size()<<":\n"; //for(auto x:s[cur])cerr<<x<<" "; //cerr<<"\n"; } void add_3(int u){ vector<int>temp; temp.push_back(u); for(auto x:adj[u]){ temp.push_back(x); } add(temp); } void dfs(int u,int p=-1){ //cerr<<"dfs:"<<u<<" "<<p<<"\n"; from[u]=p; tvis[u]=1; for(auto x:adj[u])if(x!=p&&tvis[x]==0)dfs(x,u); } void Link(int A, int B) { if(s[cur].size()==0)return; in[A]++; in[B]++; adj[A].push_back(B); adj[B].push_back(A); if(tvis[A])dfs(A,from[A]); if(tvis[B])dfs(B,from[B]); //cerr<<"FROMS:\n"; //for(int i=0;i<N;i++)cerr<<from[i]<<" "; //cerr<<"\n\n"; if(fp(A)==fp(B)){ if(cycle){ if(vis[A]&&vis[B])add({A,B}); else if(!vis[A]&&!vis[B])return void(cur++); else { //cerr<<"work\n"; if(vis[A])swap(A,B); int temp=A; //cerr<<"going back:\n"; while(!vis[temp]){ //cerr<<temp<<"\n"; vis[temp]=1; temp=from[temp]; } //cerr<<"conncection:"<<B<<" "<<temp<<"\n"; add({B,temp}); } }else{ cycle=1; dfs(A,B); int temp=B; vector<int>loop; while(temp!=A)/*cerr<<"re loop:"<<temp<<"\n",*/loop.push_back(temp),vis[temp]++,temp=from[temp]; loop.push_back(A); vis[A]++; //cerr<<"in loop:\n"; //for(auto x:loop)cerr<<x<<" "; //cerr<<"\n"; add(loop); } } un(A,B); if(in[A]==3)add_3(A); if(in[B]==3)add_3(B); if(in[A]>3)add({A}); if(in[B]>3)add({B}); } int CountCritical() { //cerr<<s[cur].size()<<"info:\n"; //for(auto x:s[cur])cerr<<x<<" "; //cerr<<"\n"; return s[cur].size(); }
#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...