Submission #1052976

#TimeUsernameProblemLanguageResultExecution timeMemory
1052976ReLiceFountain Parks (IOI21_parks)C++17
100 / 100
456 ms56752 KiB
#include "parks.h"
#include <bits/stdc++.h>
#define pb push_back
#define ll int
#define ins insert
#define sz size()
#define vll vector<ll>
#define fr first
#define sc second
#define all(x) x.begin(),x.end()
using namespace std;
const int N=2e5+5;
const int inf=1e9;
map<pair<ll,ll>, ll> f;
vll xx, yy;

ll xd[4] = {2, 0}, yd[4] = {0, 2};
ll bx[2][4] = {{1, -1}, { 1, 1}};
ll by[2][4] = {{1,  1}, {-1, 1}};

set<pair<ll,ll>> vis;
vll v,u,a,b;
ll n,c;
ll p[N], siz[N];
bool ok(ll x,ll y){
	if(x % 2) return (vis.find({x, y}) == vis.end());
	return f[{x,y}];
}

ll anc(ll a){
	return (p[a] == a ? a : p[a] = anc(p[a]));
}
bool uni(ll a, ll b){
	a = anc(a);
	b = anc(b);
	if(a == b)return false;
	if(siz[a]>siz[b]) swap(a, b);
	p[a] = b;
	siz[b] += siz[a];
	return true;
}

void go(ll x, ll y){
	c++;
	for(ll i=0;i<2;i++){
		ll nx = x + xd[i], ny = y + yd[i];
		
		ll p = (x + y) / 2 % 2;
		ll aa = x + bx[p][i], bb = y + by[p][i];
		
		if(!ok(nx, ny) || !ok(aa, bb) || !uni(f[{nx,ny}],f[{x,y}])) continue;
		
		v.pb(f[{x,y}]-1);
		u.pb(f[{nx,ny}]-1);
		a.pb(aa);
		b.pb(bb);
		
		vis.ins({aa, bb});
	}
}
int construct_roads(vector<int> X, vector<int> Y) {
	n=X.size();
	vector<array<int,3>> V;
	
	for(int i=0;i<n;i++){
		f[{X[i], Y[i]}] = i + 1;
		V.pb({X[i] + Y[i], X[i], i + 1});
	}
	
	sort(all(V));
	
	xx.pb(0);
	yy.pb(0);
	for(auto i : X) xx.pb(i);
	for(auto i : Y) yy.pb(i);
	
	for(ll i=1;i<=n;i++){p[i]=i,siz[i]=1;}
	
	for(ll i=0;i<n;i++){
		ll x = xx[V[i][2]];
		ll y = yy[V[i][2]];
		//~ cout<<x<<' '<<y<<endl;
		go(x,y);
	}
	
	//~ for(ll i=0;i<(ll)u.size();i++){
		//~ cout<<X[v[i]]<<' '<<Y[v[i]]<<endl;
		//~ cout<<X[u[i]]<<' '<<Y[u[i]]<<endl;
		//~ cout<<a[i]<<' '<<b[i]<<endl;
		//~ cout<<endl;
	//~ }
	
	if((ll)u.size() != n - 1) return 0;
	
	build(u, v, a, b);
	
	return 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...
#Verdict Execution timeMemoryGrader output
Fetching results...