Submission #1054426

#TimeUsernameProblemLanguageResultExecution timeMemory
1054426KiprasSwapping Cities (APIO20_swap)C++17
0 / 100
1 ms4700 KiB
#include <bits/stdc++.h> typedef long long ll; using namespace std; #include "swap.h" const ll maxN = 1e5+10; ll par[maxN], timeP[maxN], cycle[maxN], sz[maxN]; ll n, m; vector<ll> adj[maxN]; vector<pair<ll, pair<ll, ll>>> edges; ll find(ll node, ll t) { if(par[node]==node)return node; if(timeP[node]<=t) { return find(par[node], t); } return node; } void unite(ll a, ll b, ll t, bool is){ a = find(a, t); b = find(b, t); if(a==b){ cycle[a]=t; cycle[b]=t; return; } if(sz[a]>sz[b]) { swap(a, b); } if(cycle[a]==0&&cycle[b]!=0) cycle[a]=cycle[b]; else if(cycle[b]==0&&cycle[a]!=0) cycle[b]=cycle[a]; if(is) { if(cycle[a]==0)cycle[a]=t; if(cycle[b]==0)cycle[b]=t; } sz[b]+=sz[a]; par[a]=b; timeP[a]=t; } void init(int N, int M, vector<int> U, vector<int> V, vector<int> W) { n=N; m=M; for(int i = 0; i < m; i++) { edges.push_back({W[i], {U[i], V[i]}}); } for(int i = 1; i <= n; i++) { par[i]=i; sz[i]=1; } sort(edges.begin(), edges.end()); for(auto i : edges) { ll v = i.second.first, u = i.second.second; ll w = i.first; adj[v].push_back(u); adj[u].push_back(v); bool is = 0; if(adj[v].size()>2||adj[u].size()>2)is=1; unite(v, u, w, is); } } int getMinimumFuelCapacity(int X, int Y) { ll l = 0, h = 1e18; while(l < h && l < 1e10) { ll m = (l+h)/2; ll v1 = find(X, m), v2 = find(Y, m); if(v1==v2&&cycle[v1]<=m) { h=l; }else l = h+1; } if(h>1e10) { return -1; }else return l; }
#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...