Submission #306684

#TimeUsernameProblemLanguageResultExecution timeMemory
306684azberjibiouSwapping Cities (APIO20_swap)C++17
100 / 100
606 ms37788 KiB
#include "swap.h" #include <bits/stdc++.h> #define fir first #define sec second #define pii pair<int, int> #define ll long long using namespace std; const int mxN=100010; const int mxM=200020; const int INF=1000000007; typedef struct line{ int s, e, val; }line; int N, M; vector <line> lin; vector <pii> col[mxN]; vector <int> Colp[mxN]; bool Chk[mxN]; int Pos[mxN]; int deg[mxN]; bool cmp1(line a, line b) { return a.val<b.val; } bool cmp2(pii a, pii b) { if(a.fir!=b.fir) return a.fir<b.fir; return a.sec<b.sec; } void init(int n, int m, vector<int> U, vector<int> V, vector<int> W) { N=n, M=m; lin.resize(M); for(int i=0;i<M;i++) lin[i].s=U[i], lin[i].e=V[i], lin[i].val=W[i]; sort(lin.begin(), lin.end(), cmp1); for(int i=0;i<N;i++) col[i].push_back({0, i}); for(int i=0;i<N;i++) Colp[i].push_back(i); for(int i=0;i<M;i++) { int now1=lin[i].s, now2=lin[i].e, col1, col2; col1=col[now1].back().sec, col2=col[now2].back().sec; if(col1==col2) { if(Chk[col1]) continue; for(int ele : Colp[col1]) { Pos[ele]=i+1; } Chk[col1]=true; continue; } bool can; if(Chk[col1] || Chk[col2]) can=true; else can=false; if(can) { if(!Chk[col1]) { for(int ele : Colp[col1]) Pos[ele]=i+1; Chk[col1]=true; } if(!Chk[col2]) { for(int ele : Colp[col2]) Pos[ele]=i+1; Chk[col2]=true; } } else { if(deg[now1]>=2 || deg[now2]>=2) { for(int ele : Colp[col1]) Pos[ele]=i+1; for(int ele : Colp[col2]) Pos[ele]=i+1; Chk[col1]=Chk[col2]=true; } } if(Colp[col1].size()<Colp[col2].size()) { for(int ele : Colp[col1]) { col[ele].push_back({i+1, col2}); Colp[col2].push_back(ele); } } else { for(int ele : Colp[col2]) { col[ele].push_back({i+1, col1}); Colp[col1].push_back(ele); } } deg[now1]++; deg[now2]++; } } int getMinimumFuelCapacity(int X, int Y) { if(col[X].back().sec!=col[Y].back().sec || Pos[X]==0 || Pos[Y]==0) return -1; int s=0, e=M; while(s!=e) { int mid=(s+e)/2; pii tmp={mid, INF}; int tmp1=lower_bound(col[X].begin(), col[X].end(), tmp, cmp2)-col[X].begin(); int tmp2=lower_bound(col[Y].begin(), col[Y].end(), tmp, cmp2)-col[Y].begin(); tmp1--; tmp2--; if(col[X][tmp1].sec!=col[Y][tmp2].sec) s=mid+1; else e=mid; } e=max(e, max(Pos[X], Pos[Y])); return lin[e-1].val; }
#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...