Submission #1226870

#TimeUsernameProblemLanguageResultExecution timeMemory
1226870lukasuliashviliOne-Way Streets (CEOI17_oneway)C++20
0 / 100
6 ms11584 KiB
#include<bits/stdc++.h> using namespace std; const int N=1e5+5; vector<pair<int,int>>g[N]; int tin[N],low[N],tmr; bool br[N]; int c[N],ccnt; vector<int>tr[N]; int p[N][17],dep[N]; map<pair<int,int>,int>bidx; struct E{int u,v;}e[N]; int edir[N]; void dfsb(int v,int pa=-1,int pi=-1){ tin[v]=low[v]=++tmr; for(auto[to,i]:g[v]){ if(to==pa&&i==pi)continue; if(tin[to])low[v]=min(low[v],tin[to]); else{ dfsb(to,v,i); low[v]=min(low[v],low[to]); if(low[to]>tin[v])br[i]=1; } } } void dfsc(int u,int cc){ c[u]=cc; for(auto[v,i]:g[u]) if(c[v]==-1&&!br[i])dfsc(v,cc); } void dfslca(int u,int pa){ p[u][0]=pa; for(int i=1;i<17;i++) if(p[u][i-1]!=-1)p[u][i]=p[p[u][i-1]][i-1]; for(int v:tr[u]) if(v!=pa){dep[v]=dep[u]+1;dfslca(v,u);} } int lca(int u,int v){ if(dep[u]<dep[v])swap(u,v); for(int i=16;i>=0;i--) if(p[u][i]!=-1&&dep[p[u][i]]>=dep[v])u=p[u][i]; if(u==v)return u; for(int i=16;i>=0;i--) if(p[u][i]!=-1&&p[u][i]!=p[v][i])u=p[u][i],v=p[v][i]; return p[u][0]; } void mark(int u,int v,int up){ while(u!=v){ int pa=p[u][0],a=u,b=pa; if(a>b)swap(a,b); int idx=bidx[{a,b}]; if(up)edir[idx]|=1; else edir[idx]|=2; u=pa; } } int main(){ ios::sync_with_stdio(0);cin.tie(0); int n,m;cin>>n>>m; for(int i=0;i<m;i++){ int u,v;cin>>u>>v;u--;v--; g[u].emplace_back(v,i); g[v].emplace_back(u,i); e[i]={u,v}; } dfsb(0); fill(c,c+n,-1); ccnt=0; for(int i=0;i<n;i++) if(c[i]==-1)dfsc(i,ccnt++); int id=0; for(int i=0;i<m;i++){ if(br[i]){ int a=c[e[i].u],b=c[e[i].v]; tr[a].push_back(b); tr[b].push_back(a); int x=min(a,b),y=max(a,b); bidx[{x,y}]=id++; } } memset(p,-1,sizeof p); dfslca(0,-1); int q;cin>>q; while(q--){ int u,v;cin>>u>>v;u--;v--; u=c[u];v=c[v]; int w=lca(u,v); mark(u,w,1); mark(v,w,0); } string res; for(int i=0;i<m;i++){ if(!br[i])res+='B'; else{ int a=c[e[i].u],b=c[e[i].v]; int x=min(a,b),y=max(a,b); int idx=bidx[{x,y}]; int cu=c[e[i].u],cv=c[e[i].v]; if(edir[idx]==1){ if(cu==x&&cv==y)res+='R'; else res+='L'; }else if(edir[idx]==2){ if(cu==x&&cv==y)res+='L'; else res+='R'; }else res+='B'; } } cout<<res<<'\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...