Submission #717532

#TimeUsernameProblemLanguageResultExecution timeMemory
717532alvingogoSwapping Cities (APIO20_swap)C++14
100 / 100
404 ms43376 KiB
#include <bits/stdc++.h>
#include "swap.h"
#pragma GCC optimize("Ofast")
#define AquA cin.tie(0);ios_base::sync_with_stdio(0);
#define fs first
#define sc second
#define p_q priority_queue
using namespace std;

struct TR{
    vector<vector<int> > e;
    vector<array<int,20> > as;
    vector<int> tag;
    vector<int> dep;
    vector<int> val;
    int sz=0;
    void init(int x){
        e.resize(x);
        as.resize(x);
        dep.resize(x,-1);
        val.resize(x,2e9);
        sz=x;
    }
    void add(int cnt){
        //cout << sz << " " << cnt << "\n";
        e.push_back(vector<int>());
        as.push_back(array<int,20>());
        dep.push_back(-1);
        val.push_back(cnt);
        sz++;
    }
    void eg(int a,int b){
        //cout << a << "e" << b << '\n';
        e[a].push_back(b);
    }
    void dfs(int r,int f){
        as[r][0]=f;
        val[r]=min(val[r],val[f]);
        dep[r]=dep[f]+1;
        for(int i=1;i<20;i++){
            as[r][i]=as[as[r][i-1]][i-1];
        }
        for(auto h:e[r]){
            dfs(h,r);
        }
    }
    int lca(int a,int b){
        if(dep[a]>dep[b]){
            swap(a,b);
        }
        for(int i=19;i>=0;i--){
            if(dep[as[b][i]]>=dep[a]){
                b=as[b][i];
            }
        }
        for(int i=19;i>=0;i--){
            if(as[b][i]!=as[a][i]){
                a=as[a][i];
                b=as[b][i];
            }
        }
        return as[a][0];
    }
}tr;

struct DSU{
    vector<int> bo,tag;
    int sz=0;
    vector<int> deg;
    void init(int n){
        bo.resize(n);
        iota(bo.begin(),bo.end(),0);
        tag.resize(n);
        deg.resize(n);
        sz=n;
    }
    int find(int x){
        return bo[x]==x?x:bo[x]=find(bo[x]);
    }
    void merge(int x,int y,int cnt){
        deg[x]++;
        deg[y]++;
        int u=(deg[x]>=3 || deg[y]>=3);
        x=find(x);
        y=find(y);
        if(x==y){
            if(tag[x]==0){
                tag[x]=1;
                tr.val[x]=cnt;
            }
            return;
        }
        tag.push_back(0);
        bo.push_back(sz);
        deg.push_back(0);
        bo[x]=bo[y]=sz;
        tag[sz]|=tag[x];
        tag[sz]|=tag[y];
        tag[sz]|=u;
        if(!tag[sz]){
            cnt=2e9;
        }
        tr.add(cnt);
        tr.eg(sz,x);
        tr.eg(sz,y);
        sz++;
    }
}dsu;
void init(int n, int m, vector<int> u, vector<int> v, vector<int> w) {
    dsu.init(n);
    tr.init(n);
    vector<pair<int,pair<int,int> > > eg;
    for(int i=0;i<m;i++){
        eg.push_back({w[i],{u[i],v[i]}});
    }
    sort(eg.begin(),eg.end());
    for(auto h:eg){
        dsu.merge(h.sc.fs,h.sc.sc,h.fs);
    }
    tr.tag=dsu.tag;
    tr.dfs(tr.sz-1,tr.sz-1);
}

int getMinimumFuelCapacity(int x, int y) {
    int u=tr.lca(x,y);
    if(tr.val[u]>1.5e9){
        return -1;
    }
    return tr.val[u];
}
#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...