Submission #831629

#TimeUsernameProblemLanguageResultExecution timeMemory
831629DJeniUpKeys (IOI21_keys)C++17
37 / 100
1173 ms194116 KiB
#include <bits/stdc++.h>
using namespace std;

typedef int ll;
typedef pair<ll,ll>pairll;

#define N 150007
#define pb push_back
#define fr first
#define sc second

vector<int> ans;

ll p[2*N],f[2*N],n,m,d[2*N],sz[2*N],fr[2*N];

map<ll,vector<ll> >v[2*N];

vector<ll>v2[2*N];

vector<pairll>v1[2*N];

set<ll>s[2*N],del[2*N],a[2*N],s1[2*N];

ll P(ll x){
	if(p[x]!=x)p[x]=P(p[x]);
	return p[x];
}

void A(ll x,ll y){
	if(P(x)==P(y))return ;
	x=P(x);
	y=P(y);
	if(rand()%2)swap(x,y);
	p[y]=x;

	if(v1[x].size()<v1[y].size()){
		swap(v1[x],v1[y]);
		swap(s[x],s[y]);
	}
	while(v1[y].size()>0){
		if(s[y].count(v1[y].back().fr)==0 && s[x].count(v1[y].back().fr)!=0){
			v2[x].pb(v1[y].back().sc);
		}
		v1[x].pb(v1[y].back());
		v1[y].pop_back();
	}
	if(v2[y].size()>v2[x].size())swap(v2[y],v2[x]);
	
	while(v2[y].size()>0){
		v2[x].pb(v2[y].back());
		v2[y].pop_back();
	}
	if(s[y].size()>s[x].size()){
		swap(s[x],s[y]);
		swap(v[x],v[y]);
	}
	for(auto it:s[y]){
		if(s[x].count(it)==0){
			s[x].insert(it);
			for(auto jt:v[x][it]){
				v2[x].pb(jt);
			}
		}
	}
	if(a[x].size()<a[y].size()){
		swap(a[x],a[y]);
		swap(v[x],v[y]);
		swap(s1[x],s1[y]);
	}
	for(auto it:a[y]){
		if(v[y][it].size()>v[x][it].size())swap(v[x][it],v[y][it]);
		while(v[y][it].size()>0){
			v[x][it].pb(v[y][it].back());
			v[y][it].pop_back();
		}
		if(s1[x].count(it)!=0)s[x].insert(it);
		a[x].insert(it);
	}
	

	
	sz[x]+=sz[y];
	return ;
}

ll S(ll x,ll y){
	x=P(x);
	//cout<<x<<" "<<y<<" "<<f[x]<<" "<<s[x].size()<<endl;
	if(f[x]==2)return x;
	if(f[x]==1)return 0;
	//cout<<1<<endl;
	f[x]=2;
	ll fl=1;
	while(v2[x].size()>0){
		fl=0;
		//cout<<2<<endl;
			//	cout<<x<<" "<<it<<" "<<v[x][it].size()<<endl;
		while(v2[x].size()>0){
			ll m1=v2[x].back();
			v2[x].pop_back();
			if(P(m1)!=P(x)){
				ll g=S(m1,x);
				if(g!=0){
					if(x==g){
						fl=1;
						break;
					}else{
						A(x,y);
						return g;
					}
				}
			}
		}
		
		x=P(x);
	}
	f[x]=1;
	return 0;
}

vector<int> find_reachable(vector<int> r, vector<int> u, vector<int> w, vector<int> c) {
	n=r.size();
	for(int i=1;i<=n;i++){
		d[i]=r[i-1];
		p[i]=i;
		s[i].insert(d[i]);
		sz[i]=1;
	}
	m=u.size();
	for(int i=0;i<m;i++){
		u[i]++;
		w[i]++;
		v[u[i]][c[i]].pb(w[i]);
		v[w[i]][c[i]].pb(u[i]);
		v1[u[i]].pb({c[i],w[i]});
		v1[w[i]].pb({c[i],u[i]});
		if(c[i]==d[u[i]]){
			v2[u[i]].pb(w[i]);
		}

		if(c[i]==d[w[i]]){
			v2[w[i]].pb(u[i]);
		}
		a[u[i]].insert(c[i]);
		a[w[i]].insert(c[i]);
	}
	for(int i=1;i<=n;i++){
		if(f[i]==0)S(i,i);
	}
	for(int i=1;i<=n;i++){
		s[i].clear();
	}
	for(int i=1;i<=n;i++){
		s[P(i)].insert(d[i]);
	}
	ll mn=n;
	for(int i=1;i<=n;i++){
		if(p[i]==i){
			for(auto it:v1[i]){
				if(s[i].count(it.fr)!=0 && P(it.sc)!=i)fr[i]=1;
			}
			if(fr[i]==0)mn=min(mn,sz[i]);
		}
		//cout<<i<<" "<<P(i)<<endl;
	}
	ans.resize(n);
	for(int i=1;i<=n;i++){
		if(fr[P(i)]==0 && sz[P(i)]==mn)ans[i-1]=1;
	}

	return ans;
}

Compilation message (stderr)

keys.cpp: In function 'll S(ll, ll)':
keys.cpp:93:5: warning: variable 'fl' set but not used [-Wunused-but-set-variable]
   93 |  ll fl=1;
      |     ^~
#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...