Submission #319743

#TimeUsernameProblemLanguageResultExecution timeMemory
319743soroushRigged Roads (NOI19_riggedroads)C++14
100 / 100
1581 ms114696 KiB
/*
#pragma GCC optimize("O2")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx,avx2,sse,sse2,fma,tune=native")
//*/
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int  ,int > pii;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const ll maxn  = 3e5+100;
const ll mod =1e9+7;
const ld PI = acos((ld)-1);

#define pb push_back
#define endl '\n'
#define dokme(x) cout << x , exit(0)
#define migmig ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define ms(x , y) memset(x , y , sizeof x)
ll pw(ll a, ll b, ll md = mod){ll res = 1;while(b){if(b&1){res=(a*res)%md;}a=(a*a)%md;b>>=1;}return(res);}

int n , m;
pii e[maxn];
int ans[maxn];
int cur = 1;

vector < int > adj[maxn];
map < pii , int > mp;
int par[maxn][30];
int h[maxn];

int Par[maxn];
int sz[maxn];

int getpar(int v){
	return((v == Par[v]) ? v : Par[v] = getpar(Par[v]));
}

void merge(int u , int v){
	u = getpar(u) , v = getpar(v);
	if(u == v)return;
	if(h[u] < h[v])
		swap(u , v);
	sz[v] += sz[u];
	Par[u] = v;
}

void dfs(int v){
    for (auto u : adj[v]){
        if(u!=par[v][0]){
            par[u][0] = v;
            h[u] = h[v]+1;
            dfs(u);
        }
	}
}

int lca(int u , int v){
    if(h[u] > h[v]){
        swap(u , v);
    }
    for (int i = 20 ; i >= 0 ; i --){
        if(par[v][i] and h[par[v][i]]>=h[u]){
            v = par[v][i];
        }
    }
    if(v == u){
        return(v);
    }
    for (int i = 20 ; i >= 0 ; i --){
        if(par[v][i] != par[u][i]){
            v = par[v][i] , u = par[u][i];
        }
    }
    return(par[v][0]);
}

void init(){
	dfs(1);
	h[0] = -1e9;
	for(int i = 1 ; i <= n;  i ++)
		Par[i] = i , sz[i] = 1;
    for (int j = 1; j < 20 ; j ++){
        for (int i = 1 ; i <= n ; i ++){
            par[i][j] = par[par[i][j - 1]][j - 1];
        }
    }
}

int dist(int u , int v){
	return(h[u] + h[v] - 2*h[lca(u, v)]);
}


void connect(int u , int v){
	int lc = lca(u , v);
	vector < int > vec;
	vec.clear();
	while(h[v] > h[lc]){
		if(ans[mp[{v , par[v][0]}]] == 0)
			vec.pb(mp[{v , par[v][0]}]);
		v = par[v][0];
		v = getpar(v);
	}
	while(h[u] > h[lc]){
		if(ans[mp[{u , par[u][0]}]] == 0)
			vec.pb(mp[{u , par[u][0]}]);
		u = par[u][0];
		u = getpar(u);
	}
	sort(vec.begin() , vec.end());
	vec.resize(unique(vec.begin() , vec.end()) - vec.begin());
	for(int v : vec)
		ans[v] = cur++,merge(e[v].first , e[v].second);
}

int32_t main(){
    migmig;
    cin >> n >> m;
    for(int i = 1 ; i <= m ; i ++)
		cin >> e[i].first >> e[i].second;
	for(int i = 1 ; i < n ; i ++){
		int x;
		cin >> x;
		mp[e[x]] = mp[{e[x].second , e[x].first}] = x;
		adj[e[x].first].pb(e[x].second);
		adj[e[x].second].pb(e[x].first);
	}
	init();
	for(int i = 1 ; i <= m ; i ++){
		if(ans[i])continue;
		if(mp.count(e[i])){
			ans[i] = cur++;
		}
		else{
			connect(e[i].first , e[i].second); // tu derakht masireshun ro add kon
			ans[i] = cur++;
		}
	}
	for(int i = 1; i <= m ; i ++)
		cout << ans[i] << ' ';
    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...