제출 #1339895

#제출 시각아이디문제언어결과실행 시간메모리
1339895danglayloi1자매 도시 (APIO20_swap)C++20
100 / 100
293 ms60192 KiB
#include "swap.h"
#include <bits/stdc++.h>
#define ii pair<int, int>
#define fi first
#define se second
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
using ll = long long;
const ll mod=1e9+7;
const int nx=3e5+5;
const int LG=19;
int par[nx], up[nx][LG], deg[nx], sz, wei[nx], h[nx];
vector<int> adj[nx];
bool ok[nx], ck[nx][LG];
int find(int u)
{
    if(!par[u]) return u;
    return par[u]=find(par[u]);
}
void join(int u, int v, int w)
{
    int x=u, y=v;
    deg[x]++;
    deg[y]++;
    u=find(u);
    v=find(v);
    sz++;
    adj[sz].emplace_back(u);
    wei[sz]=w;
    par[u]=sz;
    if(u!=v)
    {
        adj[sz].emplace_back(v);
        par[v]=sz;
    }
    ok[sz]=ok[u]|ok[v]|(u==v)|(deg[x]>2)|(deg[y]>2);
}
void dfs(int u)
{
    for(int v:adj[u])
    {
        up[v][0]=u;
        h[v]=h[u]+1;
        ck[v][0]=ok[v];
        for(int i = 1; i < LG; i++)
        {
            up[v][i]=up[up[v][i-1]][i-1];
            ck[v][i]=ck[v][i-1]|ck[up[v][i-1]][i-1];
        }
        dfs(v);
    }
}
int jump(int u, int k)
{
    for(int i = 0; i < LG; i++)
        if(k>>i&1) u=up[u][i];
    return u;
}
int lca(int u, int v)
{
    if(h[u]<h[v]) swap(u, v);
    u=jump(u, h[u]-h[v]);
    if(u==v) return u;
    for(int i = LG-1; i >= 0; i--)
        if(up[u][i]!=up[v][i])
            u=up[u][i], v=up[v][i];
    return up[u][0];
}
void init(int n, int m, vector<int> U, vector<int> V, vector<int> W)
{
    vector<pair<int, ii>> ed={};
    for(int i = 0; i < m; i++)
        ed.push_back({W[i], {U[i]+1, V[i]+1}});
    sort(ed.begin(), ed.end());
    for(int i = 1; i <= n+m; i++)
        par[i]=0, deg[i]=0, adj[i].clear(), ok[i]=0;
    sz=n;
    for(auto it:ed)
    {
        int u, v;
        tie(u, v)=it.se;
        join(u, v, it.fi);
    }
    h[sz]=0;
    dfs(sz);
}
int getMinimumFuelCapacity(int u, int v)
{
    u++, v++;
    int p=lca(u, v);
    for(int i = LG-1; i >= 0; i--)
        if(up[p][i] && !ck[p][i]) p=up[p][i];
    if(ok[p]) return wei[p];
    return -1;
}
// int main()
// {
//     ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    
// }
#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...