Submission #569908

#TimeUsernameProblemLanguageResultExecution timeMemory
569908sumit_kk10Swapping Cities (APIO20_swap)C++17
50 / 100
2075 ms42240 KiB
#include "swap.h" #include<bits/stdc++.h> #include <vector> #define pb push_back #define F first #define S second using namespace std; const int N = 1e6 + 5; vector<pair<int, int> > g[N]; vector<pair<int, pair<int, int> > > edges; int mx, n, m, component[N], deg[N], max_deg[N], edg_cnt[N], cnt[N]; bool sb2 = 1, sb1 = 1; int find(int x){ while(true){ if(x == component[x]) return x; component[x] = component[component[x]]; x = component[x]; } } void merge(int a, int b){ int u = find(a), v = find(b); deg[a]++; deg[b]++; max_deg[v] = max({max_deg[v], max_deg[u], deg[a], deg[b]}); if(v != u) edg_cnt[v] += edg_cnt[u] + 1; else edg_cnt[v]++; if(u != v) cnt[v] += cnt[u]; component[u] = v; } void init(int N, int M, std::vector<int> U, std::vector<int> V, std::vector<int> W) { n = N; m = M; int wut = 0; map<int, int> mp; for(int i = 0; i < M; ++i){ int u = U[i], v = V[i], w = W[i]; if(u != 0 and v != 0) sb2 = false; g[u].pb({w, v}); g[v].pb({w, u}); mx = max(mx, w); edges.pb({w, {u ,v}}); mp[u]++; mp[v]++; } for(int i = 0; i < n; ++i) sort(g[i].begin(), g[i].end()); sort(edges.begin(), edges.end()); for(auto k : mp) wut = max(wut, k.S); if(wut > 2) sb1 = false; } int getMinimumFuelCapacity(int X, int Y) { if(sb2 and m == n - 1){ if(n <= 3) return -1; if(X == 0){ int x = g[Y][0].F, xx, dest, mn; if(g[0][0].S != Y){ xx = g[0][0].F; dest = g[0][0].S; }else{ xx = g[0][1].F; dest = g[0][1].S; } if(g[0][1].S != Y and g[0][1].S != dest) mn = g[0][1].F; else mn = g[0][2].F; return max({x, xx, mn}); } int x = g[X][0].F, xx = g[Y][0].F, mn; if(g[0][0].S != X and g[0][0].S != Y) mn = g[0][0].F; else if(g[0][1].S != X and g[0][1].S != Y) mn = g[0][1].F; else mn = g[0][2].F; return max({x, xx, mn}); } if(sb1){ if(m == n - 1) return -1; else return mx; } for(int i = 0; i < n; ++i){ component[i] = i; deg[i] = 0; max_deg[i] = 0; edg_cnt[i] = 0; cnt[i] = 1; } for(auto k : edges){ int u = k.S.F, v = k.S.S, c = k.F; merge(u, v); // cout << ((max_deg[find(X)] > 2) or (edg_cnt[find(X)] >= cnt[find(X)])) << endl; if(find(X) == find(Y) and ((max_deg[find(X)] > 2) or (edg_cnt[find(X)] >= cnt[find(X)]))) return c; } return -1; }
#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...