제출 #1347227

#제출 시각아이디문제언어결과실행 시간메모리
1347227hanguyendanghuyEvacuation plan (IZhO18_plan)C++20
100 / 100
431 ms81460 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(),x.end()
const ll MAXN=2e6+5,MOD=1e9+7,INF=1e9,LG=16,MAX=1e9,base=31;
ll i,n,m,j,k,p,t,a[MAXN],par[MAXN],sz[MAXN],l[MAXN],r[MAXN],best[MAXN],dist[MAXN];
struct h{
    ll u,v,c;
} edge[MAXN];
struct mt{
    ll u,v;
} q[MAXN];
vector<pair<ll,ll>> adj[MAXN];
vector<ll> luu[MAXN];
priority_queue<pair<ll,ll>> pq;
void dij(){
    while(pq.size()){
        auto k=pq.top();pq.pop();
        if(-k.fi>dist[k.se]){
            continue;
        }
        for(auto x:adj[k.se]){
            if(dist[x.fi]>-k.fi+x.se){
                dist[x.fi]=-k.fi+x.se;
                pq.push({-dist[x.fi],x.fi});
            }
        }
    }
}
ll find(ll v){
    return (par[v]==v?v:par[v]=find(par[v]));
}
void union_set(ll u,ll v){
    u=find(u),v=find(v);
    if(u==v) return;
    if(sz[u]<sz[v]) swap(u,v);
    par[v]=u;
    sz[u]+=sz[v];
}
bool cmp(h x,h y){
    return x.c>y.c;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    // freopen("CGAME.inp","r",stdin);
    // freopen("CGAME.out","w",stdout);
    cin>>n>>m;
    for(i=1;i<=n;i++)
        dist[i]=INF;
    for(i=1;i<=m;i++){
        ll u,v,c;
        cin>>u>>v>>c;
        edge[i]={u,v,c};
        adj[u].pb({v,c});
        adj[v].pb({u,c});
    }
    cin>>k;
    for(i=1;i<=k;i++){
        cin>>p;
        dist[p]=0;
        pq.push({0,p});
    }
    dij();
    for(i=1;i<=m;i++){
        edge[i].c=min(dist[edge[i].u],dist[edge[i].v]);
    }
    sort(edge+1,edge+m+1,cmp);
    cin>>k;
    vector<ll> b;
    for(i=1;i<=k;i++){
        cin>>q[i].u>>q[i].v;
        l[i]=1;
        r[i]=m;
        best[i]=0;
        b.pb(i);
    }
    while(b.size()){
        for(i=1;i<=n;i++)
            par[i]=i,sz[i]=1;
        vector<ll> c;
        for(ll x:b){
            if(l[x]>r[x]) continue;
            c.pb(x);
            luu[(l[x]+r[x])>>1].pb(x);
        }
        for(i=1;i<=m;i++){
            union_set(edge[i].u,edge[i].v);
            for(ll x:luu[i]){
                if(find(q[x].u)==find(q[x].v)){
                    best[x]=edge[i].c;
                    r[x]=i-1;
                }
                else l[x]=i+1;
            }
            luu[i].clear();
        }
        swap(b,c);
    }
    for(i=1;i<=k;i++)
        cout<<best[i]<<'\n';
    return 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...