Submission #1252523

#TimeUsernameProblemLanguageResultExecution timeMemory
1252523nasjesRigged Roads (NOI19_riggedroads)C++20
30 / 100
376 ms155756 KiB
#include <iostream> #include <iomanip> #include <vector> #include <cmath> #include <algorithm> #include <set> #include <queue> #include <map> #include <stack> #include <bitset> #include <string> #include <cstring> #include <iterator> #include <random> using namespace std; typedef long long ll; typedef pair<ll, ll> pll; typedef long double ld; const ll dim = 1e6+7; //const ll mod = 1e9 + 7; const ll inf = 1e17 + 77; //#define endl "\n" #define fi first #define pb push_back #define se second #define vll vector<ll> ll n, m,k, t; ll boss[dim]; pll a[dim]; vector<pll> g[dim]; ll vis[dim]; ll mn[dim], tin[dim], tout[dim]; ll jump[dim][30]; ll depth[dim]; ll par[dim]; ll tt=0; ll up[dim]; ll findboss(ll v){ if(boss[v]==v)return v; return boss[v]=findboss(boss[v]); } bool team(ll x, ll y){ return (findboss(x)==findboss(y)); } void unite(ll x, ll y){ ll xx=findboss(x); ll yy=findboss(y); if(depth[xx]>depth[yy])swap(xx, yy); boss[yy]=xx; } ll same(ll x, ll y){ if(tin[x]<=tin[y] && tout[y]<=tout[x])return 1; swap(x, y); if(tin[x]<=tin[y] && tout[y]<=tout[x])return 1; return 0; } void dfs(ll v, ll p, ll d, ll w){ tt++; tin[v]=tt; par[v]=p; jump[v][0]=p; depth[v]=d; up[v]=w; for(int i=1; i<=20; i++){ jump[v][i]=jump[jump[v][i-1]][i-1]; } for(auto el: g[v]){ if(el.fi==p)continue; dfs(el.fi, v, d+1, el.se); } tt++; tout[v]=tt; } ll lca(ll x, ll y){ if(depth[x]<depth[y])swap(x, y); if(same(x, y)){return y;} ll cur=x; for(int i=20; i>=0; i--){ if(!same(jump[cur][i], y)){ cur=jump[cur][i]; } } cur=jump[cur][0]; return cur; } set<ll> top; void go(ll v, ll aim){ // cout<<v<<" "<<aim<<endl; if(team(v, aim))return; ll nw=findboss(v); unite(nw, par[nw]); top.insert(up[nw]); go(par[nw], aim); } int main() { ll u,v, w, q, l, r; cin>>n>>m; set<ll> s; for(int i=1; i<=m; i++){ cin>>u>>v; a[i]={u, v}; } for(int i=1; i<=n; i++)boss[i]=i; vll d; for(int i=1; i<=n-1; i++){ cin>>u; d.pb(u); g[a[u].fi].pb({a[u].se, u}); g[a[u].se].pb({a[u].fi, u}); vis[u]=1; } ll root=a[u].fi; // cout<<root<<endl; dfs(root, root, 1, 0); ll cnt=1; for(int i=1; i<=m; i++){ if(team(a[i].fi, a[i].se)){ continue; } ll lc=lca(a[i].fi, a[i].se); // cout<<a[i].fi<<" "<<a[i].se<<" "<<lc<<endl; top.clear(); ll add=0; go(a[i].fi, lc); go(a[i].se, lc); top.erase(i); for(auto x: top){ mn[x]=cnt+add; add++; } mn[i]=cnt+add; cnt=mn[i]+1; } for(int i=1; i<=m; i++){ if(mn[i]==0){mn[i]=cnt;cnt++;} } for(int i=1; i<=m; i++){ cout<<mn[i]<<" "; } cout<<endl; 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...