Submission #897129

#TimeUsernameProblemLanguageResultExecution timeMemory
897129LCJLYSwapping Cities (APIO20_swap)C++14
36 / 100
657 ms131660 KiB
#include "swap.h" #include <bits/stdc++.h> using namespace std; typedef pair<int,int>pii; #define show(x,y) cout << y << " " << #x << endl; #define show2(x,y,i,j) cout << y << " " << #x << " " << j << " " << #i << endl; #define show3(x,y,i,j,p,q) cout << y << " " << #x << " " << j << " " << #i << " " << q << " " << #p << endl; #define show4(x,y) for(auto it:x) cout << it << " "; cout << #y << endl; #define int long long vector<int>adj[500005]; long long cost[500005]; struct DSU{ vector<int>e; void init(int n){ e=vector<int>(n,-1); } int get(int x){return e[x]<0?x:e[x]=get(e[x]);} bool unite(int x, int y){ //x is par x=get(x),y=get(y); if(x==y) return 0; adj[x].push_back(y); adj[y].push_back(x); e[x]+=e[y]; e[y]=x; return 1; } }; int two[22][500005]; int d[500005]; void dfs(int index, int par){ for(int x=0;x<20;x++){ if(two[x][index]==-1) break; two[x+1][index]=two[x][two[x][index]]; } for(auto it:adj[index]){ if(it==par) continue; two[0][it]=index; d[it]=d[index]+1; dfs(it,index); } } int lca(int a, int b){ if(d[a]>d[b]) swap(a,b); int diff=d[b]-d[a]; for(int x=0;x<20;x++){ if(diff&(1<<x)) b=two[x][b]; } if(a==b) return a; for(int x=19;x>=0;x--){ if(two[x][b]!=two[x][a]){ a=two[x][a]; b=two[x][b]; } } return two[0][a]; } bool done[300005]; int root=0; void init(int32_t n, int32_t m, vector<int32_t> u, vector<int32_t> v, vector<int32_t> w){ pair<int,pii>edge[m]; for(int x=0;x<m;x++){ edge[x].first=w[x]; edge[x].second={u[x],v[x]}; } sort(edge,edge+m); DSU dsu; dsu.init(n+m+20); int in[n+5]; memset(in,0,sizeof(in)); root=n+1; for(int x=0;x<m;x++){ int l=edge[x].second.first; int r=edge[x].second.second; int hold=edge[x].first; in[l]++; in[r]++; l=dsu.get(l); r=dsu.get(r); if(l==r){ done[l]=true; cost[l]=hold; } else{ if(done[l]||done[r]) done[root]=true; if(in[edge[x].second.first]>2||in[edge[x].second.second]>2) done[root]=true; dsu.unite(root,l); dsu.unite(root,r); cost[root]=hold; root++; } } root--; memset(two,-1,sizeof(two)); dfs(root,-1); } int32_t getMinimumFuelCapacity(int32_t x, int32_t y){ int hold=lca(x,y); if(done[hold]){ return cost[hold]; } int cur=hold; for(int bit=19;bit>=0;bit--){ if(d[cur]>=(1<<bit)){ if(!done[two[bit][cur]]){ cur=two[bit][cur]; } } } if(cur==root) return -1; return cost[two[0][cur]]; }
#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...