Submission #1362667

#TimeUsernameProblemLanguageResultExecution timeMemory
1362667ByeWorldKeys (IOI21_keys)C++20
100 / 100
553 ms67244 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O3", "Ofast")
// #define int long long
#define ll long long
#define se second
#define fi first
#define pb push_back
#define lf (id<<1)
#define rg ((id<<1)|1)
#define md ((l+r)>>1)
using namespace std;
typedef pair<int,int> pii;
typedef pair<pii,pii> ipii;
const int MAXN = 5e5+10;
const int MAXA = 5e4+10;
const int SQRT = 300;
const int INF = 1e9;
const int MOD = 998244353;
const int LOG = 20;

int n, a[MAXN];
vector<pii> adj[MAXN];

struct dsu {
	int par[MAXN];
	void bd(){
		for(int i=1; i<=n; i++) par[i] = i;
	}
	int f(int x){
		return (par[x]==x ? x : par[x]=f(par[x]));
	}
	void mer(int x, int y){
		x = f(x); y = f(y);
		if(x==y) return;
		par[x] = y;
	}
} DSU;

int day, key[MAXN], vis[MAXN], emp[MAXN];
vector<int> can;
vector<int> vec[MAXN];

int bfs(int sta, bool ty){
	set<int> rev;
	queue<int> q; q.push(sta);

	vis[sta] = day;
	while(!q.empty()){
		int nw = q.front(); q.pop();
		if(DSU.f(nw) != DSU.f(sta)){
			for(auto wei : rev) vec[wei].clear();
			return nw;
		}

		if(ty) can.pb(nw);
		
		if(key[a[nw]] != day){
			for(auto in : vec[a[nw]]){
				if(vis[in] == day) continue;
				q.push(in);
				vis[in] = day;
			}
		}
		key[a[nw]] = day;
		// if(sta == 3) cout << nw << " nw\n";

		for(auto [nx, wei] : adj[nw]){
				// if(sta==3) cout << nx << ' '<< wei << " wei\n";
			if(vis[nx] == day) continue;
			if(key[wei] == day){
				// bisa
				q.push(nx);
				vis[nx] = day;
			} else {
				// blm bisa
				rev.insert(wei);
				vec[wei].pb(nx);
			}
		}
		// if(sta==3) cout << "Done\n";
	}
	for(auto wei : rev) vec[wei].clear();

	return -1;
}
std::vector<int> find_reachable(std::vector<int> r, std::vector<int> u, std::vector<int> v, std::vector<int> c) {
	n = r.size();
	for(int i=1; i<=n; i++) a[i] = r[i-1]+1;
	for(int i=0; i<u.size(); i++){
		adj[u[i]+1].pb({v[i]+1, c[i]+1});
		adj[v[i]+1].pb({u[i]+1, c[i]+1}); 
	}

	DSU.bd();
	vector<pii> pend;
	do {
		pend.clear();
		for(int i=1; i<=n; i++){
			if(DSU.f(i) == i){
				day++;
				int x = bfs(i, 0);
				
				if(x != -1){
					// cout << i << ' '<< x << " ix\n";
					pend.pb({i,x});
				}
			}
		}
		for(auto [x, y] : pend) DSU.mer(x, y);

			// cout << "Done\n";
	} while(!pend.empty());
	
	vector<int> opt; int mn = INF;
	for(int i=1; i<=n; i++){
		if(DSU.f(i) == i){
			can.clear();
			day++;
			bfs(i, 1);
			// cout << i << ' '<<can.size()<<" mn\n";
			// 	for(auto in : can) cout << in << ' ';
			// 		cout << " in\n";

			if(can.size() < mn){
				mn = can.size(); opt.clear();
			}
			if(can.size() == mn){
				for(auto in : can) opt.pb(in);
			}
		}
	}
	std::vector<int> ans(n, 0);
	for(auto in : opt) ans[in-1] = 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...