제출 #1305882

#제출 시각아이디문제언어결과실행 시간메모리
1305882StefanSebezSwapping Cities (APIO20_swap)C++20
100 / 100
211 ms50048 KiB
#include "swap.h"
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
const int N=1e5+50,M=2e5+50,lg=19;
int n,m;
vector<array<int,3>>grane;
//kruskal reconstruction tree
vector<int>E[N+M];
int par[N+M][lg+1],w[N+M],depth[N+M],root,nc;
bool ciklus[N+M];
void DFS(int u){
    depth[u]=depth[par[u][0]]+1;
    for(int i=1;i<=lg;i++)par[u][i]=par[par[u][i-1]][i-1];
    for(auto i:E[u])DFS(i);
}
int LCA(int u,int v){
    if(depth[u]<depth[v])swap(u,v);
    for(int i=lg;i>=0;i--)if(depth[par[u][i]]>=depth[v])u=par[u][i];if(u==v)return u;
    for(int i=lg;i>=0;i--)if(par[u][i]!=par[v][i])u=par[u][i],v=par[v][i];return par[u][0];
}

int dsupar[N],deg[N],rep[N];
bool dsuciklus[N];
void Init(int n){
    for(int i=0;i<=n;i++)dsupar[i]=rep[i]=i;
    nc=n;
}
int FS(int u){if(dsupar[u]==u)return u;return dsupar[u]=FS(dsupar[u]);}
void US(int u,int v,int weight){
    deg[u]++,deg[v]++;
    bool mx=0;if(max(deg[u],deg[v])>=3)mx=1;
    u=FS(u),v=FS(v);
    nc++;
    w[nc]=weight;
    par[rep[u]][0]=par[rep[v]][0]=nc;
    rep[v]=nc;
    if(u==v){
        ciklus[nc]=dsuciklus[u]=true;
        return;
    }
    ciklus[nc]=dsuciklus[v]=max({dsuciklus[u],dsuciklus[v],mx});
    dsupar[u]=v;
}
void init(int n1,int m1,vector<int>U,vector<int>V,vector<int>W){
    n=n1,m=m1;
    for(int i=0;i<m;i++)grane.pb({W[i],U[i]+1,V[i]+1});
    sort(grane.begin(),grane.end());
    Init(n);
    for(auto [w,u,v]:grane) US(u,v,w);
    //for(int i=1;i<=nc;i++) printf("%i: %i\n",i,par[i][0]);
    root=++nc;
    for(int i=1;i<nc;i++)if(par[i][0]==0)par[i][0]=root;
    for(int i=1;i<=nc;i++) E[par[i][0]].pb(i);
    DFS(root);
    ciklus[0]=ciklus[root]=true;
    w[0]=w[root]=-1;
}
int getMinimumFuelCapacity(int X,int Y){
    X++,Y++;
    int u=LCA(X,Y);
    for(int i=lg;i>=0;i--){
        if(!ciklus[par[u][i]])u=par[u][i];
    }
    if(!ciklus[u])u=par[u][0];
    return w[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...