Submission #1163310

#TimeUsernameProblemLanguageResultExecution timeMemory
1163310Dan4LifeICC (CEOI16_icc)C++20
90 / 100
90 ms636 KiB
#include <bits/stdc++.h>
#include "icc.h"
using namespace std;
#define pb push_back
#define sz(a) (int)a.size()
#define all(a) begin(a),end(a)

using vi = vector<int>;
using ar2 = array<int,2>;

template<int SZ> struct Dsu{
	int p[SZ]; vi v[SZ];
	set<int> comps;
	
	void init(int n){
		comps.clear();
		for(int i = 1; i <= n; i++){
			v[i].clear(); v[i].pb(i);
			p[i]=i, comps.insert(i);
		}
	}
	
	int findSet(int i){ return i==p[i]?i:p[i]=findSet(p[i]); }
	
	bool isSameSet(int i, int j){ return findSet(i)==findSet(j); }
	
	void unionSet(int i, int j){
		int x = findSet(i), y = findSet(j);
		if(x==y) return;
		if(sz(v[x])<sz(v[y])) swap(x,y);
		p[y]=x; for(auto u : v[y]) v[x].pb(u);
		v[y].clear(); v[y].shrink_to_fit(); comps.erase(y);
	}
};

Dsu<101> dsu;

bool query(vi V, vi W){
	int n = sz(V), m = sz(W); int v[n], w[m];
	for(int i = 0; i < n; i++) v[i]=V[i];
	for(int i = 0; i < m; i++) w[i]=W[i];
	return query(n,m,v,w);
}

bool Query(vi V, vi W){
	vi v, w; v.clear(); w.clear();
	for(auto u : V) for(auto x : dsu.v[u]) v.pb(x);
	for(auto u : W) for(auto x : dsu.v[u]) w.pb(x);
	return min(sz(v),sz(w))?query(v,w):0;
}

ar2 solve(vi V, vi W){
	vi v, w; v.clear(); w.clear();
	for(auto u : V) for(auto x : dsu.v[u]) v.pb(x);
	for(auto u : W) for(auto x : dsu.v[u]) w.pb(x);
	
	int x, y, l, r;
	
	l = 0, r = sz(v)-1;
	while(l<r){
		int mid = (l+r)/2; vi vv; vv.clear();
		for(int i = 0; i <= mid; i++) vv.pb(v[i]);
		if(query(vv,w)) r=mid;
		else l=mid+1;
	}
	x = v[l];
	
	l = 0, r = sz(w)-1;
	while(l<r){
		int mid = (l+r)/2; vi ww; ww.clear();
		for(int i = 0; i <= mid; i++) ww.pb(w[i]);
		if(query({x},ww)) r=mid;
		else l=mid+1;
	}
	y = w[l];
	
	return {x,y};
}

void run(int n){
	dsu.init(n); srand(time(0));
	for(int _ = 1; _ < n; _++){
		int num_comps = sz(dsu.comps); vi t[2], w;
		w.clear(); for(auto u : dsu.comps) w.pb(u);
		random_shuffle(begin(w),end(w));
		for(int j = 0; j <= __lg(num_comps-1); j++){
			t[0].clear(); t[1].clear();
			auto itr = begin(dsu.comps);
			for(int i = 0; i < num_comps; i++)
				t[i>>j&1].pb(w[i]);
			if(Query(t[0],t[1])) break;
		}
		auto [x,y] = solve(t[0],t[1]);
		setRoad(x,y); dsu.unionSet(x,y);
	}
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...