제출 #1320998

#제출 시각아이디문제언어결과실행 시간메모리
1320998JuanJLCollapse (JOI18_collapse)C++20
5 / 100
15080 ms10388 KiB
#include "collapse.h"
#include <bits/stdc++.h>

#define fst first
#define snd second
#define pb push_back
#define forn(i,a,b) for(int i = a; i<b; i++)
#define SZ(x) (int)x.size()
#define ALL(x) x.begin(),x.end()
#define mset(a,v) memset(a,v,sizeof(a))
#define FIN ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

using namespace std;
typedef long long ll;

struct UnionFind{

	ll n;
	vector<ll> p;
	vector<ll> sz;

	UnionFind(ll n=0):n(n),p(n,0),sz(n,1){
		forn(i,0,n) p[i]=i;
	}

	ll Find(ll x){
		return (p[x]==x?x:Find(p[x]));
	}

	void Union(ll a,ll b){
		ll pa = Find(a);
		ll pb = Find(b);

		if(pa==pb) return;

		if(sz[pa]<sz[pb]){
			p[pa]=pb;
		}else{
			p[pb]=pa;
			if(sz[pa]==sz[pb]) sz[pa]++;
		}
	}
		
};

std::vector<int> simulateCollapse(
	int N,
	std::vector<int> T,
	std::vector<int> X,
	std::vector<int> Y,
	std::vector<int> W,
	std::vector<int> P) {

	
	vector<pair<ll,ll>> ari;
	forn(i,0,SZ(X)) ari.pb({min(X[i],Y[i]),max(X[i],Y[i])});

	sort(ALL(ari));
	ari.erase(unique(ALL(ari)),ari.end());

	vector<bool> act(SZ(ari),false);

	vector<pair<pair<ll,ll>,ll>> qu; forn(i,0,SZ(W)) qu.pb({{W[i],P[i]},i});
	sort(ALL(qu));

	vector<int> res(SZ(qu));

	ll j = 0;
	forn(i,0,SZ(qu)){
		//cout<<"para la querie "<<qu[i].fst.fst<<" "<<qu[i].fst.snd<<'\n';
		UnionFind uf(N);
		while(j<=qu[i].fst.fst){
			ll ind = lower_bound(ALL(ari),(pair<ll,ll>){min(X[j],Y[j]),max(X[j],Y[j])})-ari.begin();
			//cout<<ind<<'\n';
			if(act[ind]) act[ind]=false;
			else act[ind]=true;
			j++;
		}

		ll cnt = N;
		forn(h,0,SZ(act)){
			if(act[h] && (ari[h].snd<=qu[i].fst.snd || ari[h].fst>=qu[i].fst.snd+1)){
				//cout<<ari[h].fst<<" "<<ari[h].snd<<'\n';
				if(uf.Find(ari[h].fst)!=uf.Find(ari[h].snd)){
					cnt--;
					uf.Union(ari[h].fst,ari[h].snd);
				}
			}
		}

		res[qu[i].snd]=cnt;
		
	}
	
	
	
	
	return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...