Submission #1346950

#TimeUsernameProblemLanguageResultExecution timeMemory
1346950DanielPr8Swapping Cities (APIO20_swap)C++20
0 / 100
0 ms344 KiB
#include "swap.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector<ll>;
using vvl = vector<vll>;
using pll = pair<ll,ll>;
using vpl = vector<pll>;
using vvp = vector<vpl>;
using vi = vector<int>;
#define f first
#define s second
#define pb push_back
#define all(v) v.begin(),v.end()
vvp g;
vll pr, id, mn, gus, sz, dep, tr;
vi w;
vector<pair<pll,ll>> bs;
ll find_gus(ll a){
    if(gus[a]==a)return a;
    return gus[a] = find_gus(gus[a]);
}
ll unite(ll a, ll b){
    a=find_gus(a);
    b=find_gus(b);
    if(a==b)return 0;
    if(sz[a]<sz[b])swap(a,b);
    gus[b]=a;
    sz[a]+=sz[b];
    return 1;
}

void dfs(ll cur, ll d=0){
    bs[cur] = {{1e15,1e15},(ll)1e15};
    dep[cur] = d;
    for(auto [i, e]: g[cur]){
        if(w[e]<bs[cur].f.f){
            bs[cur].s=bs[cur].f.s;
            bs[cur].f.s=bs[cur].f.f;
            bs[cur].f.f=w[e];
        }
        else if(w[e]<bs[cur].f.s){
            bs[cur].s=bs[cur].f.s;
            bs[cur].f.s=w[e];
        }
        else if(w[e]<bs[cur].s){
            bs[cur].s=w[e];
        }
        if(i==pr[cur])continue;
        pr[i]=cur;
        id[i]=e;
        dfs(i, d+1);
        tr[cur] = min(tr[cur], max<ll>(w[e],tr[i]));
    }
    tr[cur] = min(tr[cur], bs[cur].s);
}
void dfs2(ll cur){
    for(auto [i, e]: g[cur]){
        if(i==pr[cur])continue;
        tr[i] = min(tr[i], max<ll>(tr[cur],w[e]));
        dfs2(i);
    }
}

ll find_pr(ll a){
    if(a==0 || mn[id[a]]==1e15)return a;
    return pr[a]=find_pr(pr[a]);
}
vvl up, cir, we;
void init(int n, int m, vi u, vi v, vi W) {
    bs=vector<pair<pll,ll>>(n);
    tr = vll(m,1e15);
    w=W;
    vll ord(m), sp(m);
    iota(all(ord), 0ll);
    sort(all(ord), [&](ll i, ll j){return w[i]<w[j];});
    dep = pr = id = gus = sz = vll(n,1);
    iota(all(gus),0ll);
    mn = vll(m, 1e15);
    g = vvp(n);
    for(ll i: ord){
        if(unite(u[i],v[i])){
            sp[i]=1;
            g[u[i]].pb({v[i],i});
            g[v[i]].pb({u[i],i});
        }
    }
    id[0]=pr[0]=-1;
    dfs(0);
    dfs2(0);
    for(ll i: ord){
        if(!sp[i]){
            ll a = u[i], b=v[i];
            a=find_pr(a);
            b=find_pr(b);
            while(a!=b){
                if(dep[b]>dep[a])swap(a,b);
                mn[id[a]]=w[i];
                a=find_pr(a);
            }
        }
    }
    up=cir=we = vvl(20, vll(n));
    for(ll i = 1; i < n; ++i){
        cir[0][i] = mn[id[i]];
        we[0][i]=w[id[i]];
        up[0][i]=pr[i];
    }
    for(ll f = 1; f < 20; ++f){
        for(ll i = 0; i < n; ++i){
            up[f][i] = up[f-1][up[f-1][i]];
            cir[f][i] = min(cir[f-1][i], cir[f-1][up[f-1][i]]);
            we[f][i] = max(we[f-1][i], we[f-1][up[f-1][i]]);
        }
    }
}





int getMinimumFuelCapacity(int x, int y) {
    ll ci=min(tr[x],tr[y]), ww=0;
    if(dep[x]<dep[y])swap(x,y);
    ll d = dep[x]-dep[y];

    for(ll i = 19; i >= 0; --i){
        if(d>(1<<i)){
            d-=(1<<i);
            ci = min(ci, cir[i][x]);
            ww = max(ww, we[i][x]);
            x = up[i][x];
        }
    }
    if(pr[x]!=y){
        ci = min(ci, cir[0][x]);
        ww = max(ww, we[0][x]);
        x = up[0][x];
    }
    else{
        ci = min(ci, mn[id[x]]);
        ww = max(ww, we[0][x]);
        x = up[0][x];
    }
    if(ci==1e15 && x==y)return -1;
    if(x==y)return max(ww,ci);
    for(ll i = 19; i >= 0; --i){
        if(up[i][x]!=up[i][y]){
            ci = min(ci, cir[i][x]);
            ww = max(ww, we[i][x]);
            x = up[i][x];
            ci = min(ci, cir[i][y]);
            ww = max(ww, we[i][y]);
            y = up[i][y];
        }
    }
    ci = min(ci, cir[0][x]);
    ww = max(ww, we[0][x]);
    x = up[0][x];
    ci = min(ci, cir[0][y]);
    ww = max(ww, we[0][y]);
    y = up[0][y];
    if(ci==1e15 && x==y)return -1;
    if(x==y)return max(ww,ci);
}

Compilation message (stderr)

swap.cpp: In function 'int getMinimumFuelCapacity(int, int)':
swap.cpp:165:1: warning: control reaches end of non-void function [-Wreturn-type]
  165 | }
      | ^
#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...