Submission #1370092

#TimeUsernameProblemLanguageResultExecution timeMemory
1370092enzyKeys (IOI21_keys)C++20
37 / 100
3096 ms49756 KiB
#include<bits/stdc++.h>
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
const int maxn=3e5+10;
vector<pii>v[maxn];
int val[maxn];

vector<int>adj[maxn][2], qm[maxn];
int marc[maxn], rep[maxn];
vector<int>st;

vector<int>caras_scc[maxn];

void dfs(int u, int t, int cmp){
	marc[u]++;
	if(cmp!=-1){
		for(int x : qm[u]) caras_scc[cmp].push_back(x);
	}
	for(int viz : adj[u][t]){
		if(marc[viz]) continue;
		dfs(viz,t,cmp);
	}
	if(t==0) st.push_back(u);
}

vector<int> find_reachable(vector<int> r, vector<int> a, vector<int> b, vector<int> c){
	int n=r.size();
	vector<int>ans(n);
	for(int i=0;i<n;i++){
		val[i]=r[i];
		caras_scc[i].push_back(i);
	}
	for(int i=0;i<a.size();i++){
		v[a[i]].push_back({b[i],c[i]});
		v[b[i]].push_back({a[i],c[i]});
	}

	int at_n=n, qtd_scc=n;

	auto kosaraju=[&](){

		// cerr << "KOSARAJU\n";

		vector<int>cor(n);
		st.clear();
		for(int i=0;i<qtd_scc;i++){
			adj[i][0].clear(); adj[i][1].clear(); qm[i].clear(); marc[i]=0;
			for(int x : caras_scc[i]){
				qm[i].push_back(x);
				rep[x]=i;
			}
		}
		for(int i=0;i<qtd_scc;i++){
			for(int x : caras_scc[i]) cor[val[x]]=1;
			for(int x : caras_scc[i]){
				for(pii p : v[x]){
					if(cor[p.se]&&rep[p.fi]!=i){
						// cerr << "aresta " << i << " -> " << p.fi << '\n';
						adj[i][0].push_back(rep[p.fi]);
						adj[rep[p.fi]][1].push_back(i);
					}
				}
			}
			for(int x : caras_scc[i]) cor[val[x]]=0;
			caras_scc[i].clear();
		}
		int n_qtd_scc=0;
		for(int i=0;i<qtd_scc;i++) if(!marc[i]) dfs(i,0,-1);
		for(int i=0;i<qtd_scc;i++) marc[i]=0;
		reverse(st.begin(),st.end());
		for(int x : st){
			if(!marc[x]){
				dfs(x,1,n_qtd_scc);
				n_qtd_scc++;
			}
		}
		qtd_scc=n_qtd_scc;

	};
	
	while(true){
		kosaraju();
		if(at_n==qtd_scc) break;
		at_n=qtd_scc;	
	}

	int best=n;
	vector<int>possib;
	// cerr << "qtd_scc " << qtd_scc << '\n';
	for(int i=0;i<qtd_scc;i++){
		// cerr << "scc " << i << ": " << '\n';
		// for(int x : qm[i]) cerr << x << ' ';
		// cerr << '\n';
		if(adj[i][0].size()==0){
			if(best>qm[i].size()) best=qm[i].size(), possib.clear();
			if(best==qm[i].size()){
				for(int x : qm[i]) possib.push_back(x);
			}
		}
	}

	for(int x : possib) ans[x]=1;

	return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...