제출 #1178765

#제출 시각아이디문제언어결과실행 시간메모리
1178765LeaRouseRigged Roads (NOI19_riggedroads)C++20
100 / 100
233 ms66248 KiB
// \--> alt+92
// ^ alt gr+(costado de la ñ)
#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(0); cin.tie(0);
#define ll long long
#define ff first
#define ss second
#define pip pair<int,pair<int,int>>
const int MAX=3e5+5;
const int MOD=20000837;
using namespace std;
int ST[MAX][20];
vector<pair<int,int>>v[MAX];
int A[MAX];
int B[MAX];
int P[MAX];
bool G[MAX];

int D[MAX];
int R[MAX];
int Pa[MAX];

void sparse_table(int n){
    for(int i=1;i<20;i++){
        for(int j=1;j<=n;j++){
            ST[j][i]=ST[ST[j][i-1]][i-1];
        }
    }
}

int query(int a,int b){
    if(D[a]<D[b]){
        swap(b,a);
    }
    if(D[a]!=D[b]){
        for(int i=19;i>=0;i--){
            if(D[ST[a][i]]>D[b]){
                a=ST[a][i];
            }
        }
        a=ST[a][0];
        if(a==b){
            return a;
        }
    }

    for(int i=19;i>=0;i--){
        if(ST[a][i]!=ST[b][i]){
            a=ST[a][i];
            b=ST[b][i];
        }
    }
    return ST[a][0];
}

int find(int x){
    if(P[x]==x) return x;
    return P[x]=find(P[x]);
}

void uni(int x,int y){
    int a=find(x);
    int b=find(y);
    if(D[a]<D[b]){
        P[b]=a;
    }
    else{
        P[a]=b;
    }
}

void dfs(int x,int p){
    for(auto it:v[x]){
        if(it.ss!=p){
            ST[it.ss][0]=x;
            Pa[it.ss]=it.ff;
            D[it.ss]=1+D[x];
            dfs(it.ss,x);
        }
    }
}

int c=1;
set<int>s;
void subidita(int ini,int final){
    ini=find(ini);
   
    while(D[ini]>D[final]){
        s.insert(Pa[ini]);
        uni(ini,ST[ini][0]);
        ini=find(ST[ini][0]);
    }
}

void go(){
    int n,m;    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>A[i]>>B[i];
    }
    for(int i=1;i<=n;i++){
        P[i]=i;
    }
    for(int i=0;i<n-1;i++){
        int a;  cin>>a;
        G[a]=true;
        v[A[a]].push_back({a,B[a]});
        v[B[a]].push_back({a,A[a]});
    }
    ST[1][0]=1;
    D[1]=1;
    dfs(1,1);
    sparse_table(n);
    for(int i=1;i<=m;i++){
        if(R[i]>0)  continue;
        if(G[i]==false){
            int lca=query(A[i],B[i]);
            subidita(A[i],lca);
            subidita(B[i],lca);
            for(auto it:s){
                R[it]=c;    c++;
            }
            s.clear();
            R[i]=c;
            c++;
        }
        else{
            uni(A[i],B[i]);
            R[i]=c;
            c++;
        }  
    }
   
    for(int i=1;i<=m;i++){
        cout<<R[i]<<" ";
    }
}

int main(){
    fastio;
    go();
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...