Submission #576698

#TimeUsernameProblemLanguageResultExecution timeMemory
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...