제출 #576698

#제출 시각아이디문제언어결과실행 시간메모리
576698codr0Swapping Cities (APIO20_swap)C++14
100 / 100
313 ms31660 KiB
// Code by Parsa Eslami
 
#include "swap.h"
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
 
#define bit(i,j) ((j>>i)&1)
#define minm(x,y) x=min(x,y)
#define maxm(x,y) x=max(x,y)
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define FORR(i,a,b) for(int i=a;i>=b;i--)
#define S second
#define F first
#define pb push_back
#define SZ(x) (int)x.size()
#define all(x) x.begin(),x.end()
#define err(x) cout<<#x<<": "<<x<<'\n'
#define wtf cout<<"WHAT THE FUCK!\n"
#define dmid int mid=(r+l)/2
#define lc 2*id
#define rc 2*id+1
 
using namespace std;
const int N=1e5+4;
int D1[N],ans[N],mx[N],dsu[N],D[N];
vector<int> x[N];
vector<pii> vc[N];

	int root(int v){
		if(dsu[v]<0) return v;
		return (dsu[v]=root(dsu[v]));
	}

	void join(int u,int v,int tme){
		D[u]++;
		D[v]++;
		int z=0;
		if(D[u]==2) z--;
		else if(D[u]==1) z++;
		
		if(D[v]==2) z--;
		else if(D[v]==1) z++;
		
		int mxx=0;
		mxx=max(D[u],D[v]);

		u=root(u); v=root(v);
		if(u!=v){
			if(ans[v]&&ans[u]==0){
				for(int v0:x[u]) ans[v0]=tme;
			}
			if(ans[u]&&ans[v]==0){
				for(int v0:x[v]) ans[v0]=tme;
			}
			if(SZ(x[u])>SZ(x[v])) swap(u,v);
			for(int v0:x[u]){
				x[v].pb(v0);
				vc[v0].pb({tme,v});
			}	
			dsu[v]+=dsu[u]; dsu[u]=v;
		}
		if(u!=v) D1[v]=D1[u]+D1[v]+z;
		else D1[v]+=z;
		mx[v]=max(max(mx[v],mx[u]),mxx);
		if((mx[v]>=3||D1[v]==0)&&ans[v]==0){
			for(int v0:x[v]) ans[v0]=tme;
		}
	}

	int TIME(int u,int v){
		int pu=0;
		int numu=u;
		int numv=v;
		int pv=0;
		int rt=0;
		while(numu!=numv){
			int tmeu=1e9;
			int tmev=1e9;
			if(pu<SZ(vc[u])) tmeu=vc[u][pu].F;
			if(pv<SZ(vc[v])) tmev=vc[v][pv].F;
			if(tmeu<tmev){
				rt=tmeu;
				numu=vc[u][pu].S;
				pu++;
			}
			if(tmev<=tmeu){
				rt=tmev;
				numv=vc[v][pv].S;
				pv++;
			}
		}
		return rt;
	}

	void init(int n,int m,vector<int> u,vector<int> v,vector<int> w){
		FOR(i,0,N-1) dsu[i]=-1,x[i].pb(i);
		vector<pair<int,pii>> vcc;
		FOR(i,0,m-1) vcc.pb({w[i],{u[i],v[i]}});
		sort(all(vcc));
		FOR(i,0,m-1) join(vcc[i].S.F,vcc[i].S.S,vcc[i].F);
	}

	int getMinimumFuelCapacity(int x,int y){
		if(ans[x]==0||ans[y]==0) return -1;
		int rt=max(max(ans[x],ans[y]),TIME(x,y));
		return rt;
	}
#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...