제출 #1347252

#제출 시각아이디문제언어결과실행 시간메모리
1347252goodpjw2008자매 도시 (APIO20_swap)C++20
100 / 100
210 ms29048 KiB
#ifdef ONLINE_JUDGE
#include "swap.h"
#endif
#include <bits/stdc++.h>
using namespace std;
bool isgood[400002];
int sp[400002][20];
struct e{
    int u,v,w;
    bool operator<(const e &a)const{
        return w<a.w;
    }
};
vector<e>edge;
struct dsu{
    int par[400002],root[400002];
    void init(int n){
        for(int i = 0; i <= n; i++){
            par[i]=i;
            root[i]=i;
        }
    }
    int find(int x){
        if(par[x]==x)return x;
        return par[x]=find(par[x]);
    }

}d;
int nodec,deg[400002],cost[400002],dep[400002];
void init(int N, int M, vector<int> U, vector<int> V, vector<int> W) {
    d.init(N);
    for(int i = 0; i < M; i++)edge.push_back({U[i],V[i],W[i]});
    sort(edge.begin(),edge.end());
    nodec=N;
    for(int i = 0; i < M; i++){
        auto [u,v,w]=edge[i];
        deg[u]++;deg[v]++;
        int pu=d.find(u),pv=d.find(v),ru=d.root[pu],rv=d.root[pv];
        if(pu!=pv){
            int nxt=nodec++;
            cost[nxt]=w;
            isgood[nxt]=isgood[ru]|isgood[rv]|(deg[u]>=3)|(deg[v]>=3);
            sp[ru][0]=nxt;sp[rv][0]=nxt;
            sp[nxt][0]=nxt;
            d.par[pu]=pv;
            d.root[pv]=nxt;
        }
        else{
            if(!isgood[ru]){
                int nxt=nodec++;
                cost[nxt]=w;
                isgood[nxt]=1;
                sp[ru][0]=nxt;
                sp[nxt][0]=nxt;
                d.root[pu]=nxt;
            }
        }
    }
    for(int i = nodec-1; i >= 0; i--){
        if(sp[i][0]!=i)dep[i]=dep[sp[i][0]]+1;
        else dep[i]=0;
        for(int j = 1; j < 20; j++)sp[i][j]=sp[sp[i][j-1]][j-1];
    }
}
int lca(int x, int y){
    if(dep[x]<dep[y])swap(x,y);
    for(int i = 19; i >= 0; i--){
        if(dep[sp[x][i]]>=dep[y])x=sp[x][i];
    }
    if(x==y)return x;
    for(int i = 19; i >= 0; i--){
        if(sp[x][i]!=sp[y][i]){
            x=sp[x][i];
            y=sp[y][i];
        }
    }
    return sp[x][0];
}
int getMinimumFuelCapacity(int X, int Y){
	int l=lca(X,Y);
    if(isgood[l])return cost[l];
    for(int i = 19; i >= 0; i--){
        if(!isgood[sp[l][i]])l=sp[l][i];
    }
    l=sp[l][0];
    if(!isgood[l])return -1;
    return cost[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...