제출 #607399

#제출 시각아이디문제언어결과실행 시간메모리
607399UncoolAnonOne-Way Streets (CEOI17_oneway)C++14
0 / 100
9 ms21076 KiB
#include <bits/stdc++.h> #define pii pair<int,int> #define F first #define S second #define mp make_pair using namespace std; const int N=100000,lg=19; int tim=0; int sp[lg][N]; vector<int> adj[N],tin(N),tout(N),low(N),vis(N); map<int,int> up[N],down[N]; map<pii,int> m,s; bool SET(int a, int b){ s[mp(a,b)]=s[mp(b,a)]=1; return 1; } bool is_bridge(int a,int b){return s[mp(a,b)]; } void dfs(int a, int p){ vis[a]=1; sp[0][a]=p; for(int i=1;i<lg;i++) if(sp[i-1][a]!=-1) sp[i][a]=sp[i-1][sp[i-1][a]]; tin[a]=++tim,low[a]=tim; for(int&x:adj[a]){ if(!vis[x]){ dfs(x,a); low[a]=min(low[a],low[x]); } if(x!=p&&vis[x]){ low[a]=min(low[a],tin[x]); } if(low[x]>tin[a]) SET(x,a); } tout[a]=++tim; return ; } int is_ancestor(int a, int b){ return (tin[a]<=tin[b]&&tout[b]<=tout[a]); } int lca(int a, int b){ if(is_ancestor(a,b)) return a; for(int i=lg-1;i>-1;--i) if(sp[i][a]!=-1&&!is_ancestor(sp[i][a],b)) a=sp[i][a]; return sp[0][a]; } int blca(int a, int b){ if(is_ancestor(a,b)) return -1; for(int i=lg-1;i>-1;--i) if(sp[i][a]!=-1&&!is_ancestor(sp[i][a],b)) a=sp[i][a]; return a; } void go(int a, int p,int dcnt,int ucnt){ dcnt+=down[a][0]; ucnt+=up[a][0]; vis[a]=0; //cout<<dcnt<<" "<<ucnt<<" "<<a<<endl; for(int&x:adj[a]){ if(vis[x]){ dcnt+=down[a][x]; ucnt+=up[a][x]; if(dcnt&&ucnt){} else if(dcnt||ucnt){ if(dcnt){ m[mp(a,x)]=1; m[mp(x,a)]=-1; } else{ m[mp(a,x)]=-1; m[mp(x,a)]=1; } } go(x,a,dcnt,ucnt); dcnt-=down[a][x]; ucnt-=up[a][x]; } } dcnt+=down[a][0]; ucnt+=up[a][0]; } int main(){ for(int i=0;i<lg;i++) for(int j=0;j<N;j++) sp[i][j]=-1; int n,meme; cin>>n>>meme; vector<pii> ed; while(meme--){ int a,b; cin>>a>>b; adj[a].push_back(b); adj[b].push_back(a); ed.push_back(mp(a,b)); } dfs(1,-1); int q; cin>>q; while(q--){ int a,b; cin>>a>>b; int lc=lca(a,b) ; if(lc!=a){ up[lc][blca(a,b)]++; up[a][0]--; } if(lc!=b){ down[lc][blca(b,a)]++; down[b][0]--; } } go(1,-1,0,0); for(pii&x:ed){ if(is_bridge(x.F,x.S)){ if(m[x]==1)cout<<"R"; else if(m[x]==-1)cout<<"L"; else cout<<"B"; } else cout<<"B"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...