제출 #1335328

#제출 시각아이디문제언어결과실행 시간메모리
1335328LuvidiRigged Roads (NOI19_riggedroads)C++20
100 / 100
415 ms48020 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define pll pair<ll, ll>
#define pii pair<int, int>
#define fs first
#define sc second
#define pb push_back

const int maxn=3e5;
vector<pii> ad[maxn+1];
vector<int> st;
int pr[maxn+1],pe[maxn+1],sz[maxn+1],hd[maxn+1],od[maxn+1],id[maxn+1],tt,sg[4*maxn],ce[maxn+1],d[maxn+1];
int n,m;

void dfs(int v,int p){
    sz[v]=1;
    for(auto[u,w]:ad[v])if(u!=p){
        pr[u]=v;
        pe[u]=w;
        ce[w]=u;
        d[u]=d[v]+1;
        dfs(u,v);
        sz[v]+=sz[u];
    }
}

void dfs2(int v,int p,int h){
    hd[v]=h;
    id[v]=tt;
    od[tt++]=v;
    int x=0;
    for(auto[u,w]:ad[v])if(u!=p){
        if(sz[u]>sz[x])x=u;
    }
    if(!x)return;
    dfs2(x,v,h);
    for(auto[u,w]:ad[v])if(u!=p&&u!=x){
        dfs2(u,v,u);
    }
}

int bld(int v,int l,int r){
    if(l==r)return sg[v]=1;
    int m=l+r>>1;
    return sg[v]=bld(2*v+1,l,m)+bld(2*v+2,m+1,r);
}

int upd(int v,int l,int r,int i){
    if(i<l||i>r)return sg[v];
    if(l==r)return --sg[v];
    int m=l+r>>1;
    return sg[v]=upd(2*v+1,l,m,i)+upd(2*v+2,m+1,r,i);
}

void qry(int v,int l,int r,int l2,int r2){
    if(l>r2||r<l2||!sg[v])return;
    if(l==r){
        st.pb(pe[od[l]]);
    }else{
        int m=l+r>>1;
        qry(2*v+1,l,m,l2,r2);
        qry(2*v+2,m+1,r,l2,r2);
    }
}

void qry(int u,int v){
    while(hd[u]!=hd[v]){
        if(d[hd[u]]>d[hd[v]])swap(u,v);
        qry(0,0,n-1,id[hd[v]],id[v]);
        v=pr[hd[v]];
    }
    if(u==v)return;
    if(d[u]>d[v])swap(u,v);
    qry(0,0,n-1,id[u]+1,id[v]);
}

void solve() {
    cin>>n>>m;
    pii ed[m+1];
    for(int i=1;i<=m;i++){
        int u,v;
        cin>>u>>v;
        ed[i]={u,v};
    }
    bool sp[m+1];
    memset(sp,0,sizeof(sp));
    for(int i=0;i<n-1;i++){
        int x;
        cin>>x;
        sp[x]=1;
        auto[u,v]=ed[x];
        ad[u].pb({v,x});
        ad[v].pb({u,x});
    }
    dfs(1,1);
    dfs2(1,1,1);
    bld(0,0,n-1);
    int ans[m+1],t=0;
    bool b[m+1];
    memset(b,0,sizeof(b));
    for(int i=1;i<=m;i++)if(!b[i]){
        b[i]=1;
        if(ce[i]){
            upd(0,0,n-1,id[ce[i]]);
        }
        if(!sp[i]){
            auto[u,v]=ed[i];
            st.clear();
            qry(u,v);
            sort(st.begin(),st.end());
            for(int x:st){
                b[x]=1;
                upd(0,0,n-1,id[ce[x]]);
                ans[x]=++t;
            }
        }
        ans[i]=++t;
    }
    for(int i=1;i<=m;i++)cout<<ans[i]<<' ';
    cout<<'\n';
}

int main() {
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    solve();
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...