Submission #1059967

#TimeUsernameProblemLanguageResultExecution timeMemory
1059967mispertionSwapping Cities (APIO20_swap)C++17
30 / 100
871 ms524288 KiB
#include "swap.h" #include <bits/stdc++.h> #include <vector> #pragma gcc optimize("unroll-loops") #pragma gcc optimize("o3") #pragma gcc optimize("Ofast") using namespace std; const int N = 1e5 + 5; const int infi = INT_MAX; typedef pair<int, int> pii; #define mp make_pair #define pb push_back #define F first #define S second struct dsu{ int pw[N]; vector<pii> p[N], cnt1[N], cnt2[N], sz[N]; vector<int> st[N]; dsu(int n){ for(int i = 1; i <= n; i++){ st[i] = {i}; p[i] = {{-1, i}}; sz[i] = {{-1, 1}}; cnt1[i] = {{-1, 0}}; cnt2[i] = {{-1, 0}}; pw[i] = 0; } } dsu(){ } int getp(int v, int t){ int pos = (--upper_bound(p[v].begin(), p[v].end(),mp(t, infi))) - p[v].begin(); return p[v][pos].S; } void upd(int v, int nw, int t){ if(nw == 1) cnt1[v].pb({t, cnt1[v].back().S - 1}); if(nw == 2) cnt2[v].pb({t, cnt2[v].back().S - 1}); if(nw == 0) cnt1[v].pb({t, cnt1[v].back().S + 1}); if(nw == 1) cnt2[v].pb({t, cnt2[v].back().S + 1}); } void uni(int a, int b, int t){ int n1 = pw[a]; int n2 = pw[b]; //cout << n1 << ' ' << n2 << '\n'; pw[a]++; pw[b]++; a = getp(a, t); b = getp(b, t); if(a == b){ upd(a, n1, t); upd(a, n2, t); return; } if(sz[a] > sz[b]) swap(a, b); sz[b].pb({t, sz[b].back().S + sz[a].back().S}); for(auto e : st[a]){ st[b].pb(e); p[e].pb({t, b}); } st[a].clear(); cnt1[b].pb({t, cnt1[a].back().S + cnt1[b].back().S}); cnt2[b].pb({t, cnt2[a].back().S + cnt2[b].back().S}); upd(b, n1, t); upd(b, n2, t); } }; int n, m; vector<pair<int, pair<int, int>>> edges; dsu ds; void init(int N, int M, std::vector<int> U, std::vector<int> V, std::vector<int> W) { n = N; m = M; for(int i = 0; i < m; i++){ U[i]++; V[i]++; edges.pb({W[i], {V[i], U[i]}}); } sort(edges.begin(), edges.end()); ds = dsu(n); for(int i = 0; i < m; i++){ ds.uni(edges[i].S.F, edges[i].S.S, i); /*cout << "comp: "; for(int j = 1; j <= n; j++){ cout << ds.getp(j, infi) << ' '; } cout << '\n'; cout << "cnt1: "; for(int i = 1; i <= n; i++){ cout << ds.cnt1[ds.getp(i, infi)].back().S << ' '; } cout << '\n'; cout << "cnt2: "; for(int i = 1; i <= n; i++){ cout << ds.cnt2[ds.getp(i, infi)].back().S << ' '; } cout << '\n';*/ } } int getMinimumFuelCapacity(int X, int Y) { X++; Y++; int lo = -1, hi = m; while(lo + 1 < hi){ int m = (lo + hi) / 2; int x = ds.getp(X, m), y = ds.getp(Y, m); if(x != y){ lo = m; continue; } int c1 = (--upper_bound(ds.cnt1[x].begin(), ds.cnt1[x].end(),mp(m, infi)))->S; int c2 = (--upper_bound(ds.cnt2[x].begin(), ds.cnt2[x].end(),mp(m, infi)))->S; int sz = (--upper_bound(ds.sz[x].begin(), ds.sz[x].end(),mp(m, infi)))->S; if(c1 == 2 && c2 == sz - 2){ lo = m; continue; } hi = m; } if(hi == m) return -1; return edges[hi].F; }

Compilation message (stderr)

swap.cpp:5: warning: ignoring '#pragma gcc optimize' [-Wunknown-pragmas]
    5 | #pragma gcc optimize("unroll-loops")
      | 
swap.cpp:6: warning: ignoring '#pragma gcc optimize' [-Wunknown-pragmas]
    6 | #pragma gcc optimize("o3")
      | 
swap.cpp:7: warning: ignoring '#pragma gcc optimize' [-Wunknown-pragmas]
    7 | #pragma gcc optimize("Ofast")
      |
#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...