제출 #1149863

#제출 시각아이디문제언어결과실행 시간메모리
1149863dostsOne-Way Streets (CEOI17_oneway)C++20
0 / 100
4 ms10560 KiB
#include <bits/stdc++.h> #pragma GCC target("avx2") #pragma GCC optimize("O3,unroll-loops") using namespace std; #define int long long #define pii pair<int,int> #define ff first #define ss second #define sp << " " << #define all(cont) cont.begin(),cont.end() #define vi vector<int> const int inf = 1e17,N = 1e5+1,MOD = 1e9+7,BL = 1000; vector<pii> edges[N]; vi bridge(N,0),tree(N),tin(N,0),low(N,0),comp(N,0),dp(N,0),realedg[N],tout(N); int timer = 1; void dfs(int node,int id,int treeid) { tree[node] = treeid; tin[node] = low[node] = timer++; for (auto it : edges[node]) { if (it.ss == id) continue; if (!tin[it.ff]) { dfs(it.ff,it.ss,treeid); if (low[it.ff] >= tin[it.ff]) bridge[it.ss] = 1; } low[node] = min(low[node],low[it.ff]); } } void dfs2(int node,int compid) { if (comp[node]) return; comp[node] = compid; for (auto it : edges[node]) { if (!bridge[it.ss]) dfs2(it.ff,compid); } } void dfs3(int node,int p) { tin[node] = timer++; for (auto it : realedg[node]) { if (it == p) continue; dfs3(it,node); } tout[node] = timer-1; } bool anc(int a,int b) { return tin[a] <= tin[b] && tout[a] >= tout[b]; } void dfs4(int node,int p) { for (auto it : realedg[node]) { if (it == p) continue; dfs4(it,node); dp[node]+=dp[it]; } } void solve() { int n,m; cin >> n >> m; vector<pii> edg(m+1); for (int i=1;i<=m;i++) { int a,b; cin >> a >> b; edg[i] = {a,b}; edges[a].push_back({b,i}); edges[b].push_back({a,i}); } int ctr = 0; for (int i=1;i<=n;i++) { if (tin[i]) continue; dfs(i,-1,++ctr); } ctr = 0; for (int i=1;i<=n;i++) { if (comp[i]) continue; dfs2(i,++ctr); } for (int i=1;i<=m;i++) { if (!bridge[i]) continue; realedg[comp[edg[i].ff]].push_back(comp[edg[i].ss]); realedg[comp[edg[i].ss]].push_back(comp[edg[i].ff]); } timer = 1; dfs3(1,1); int q; cin >> q; while (q--) { int a,b; cin >> a >> b; int x = comp[a],y = comp[b]; if (x == y) continue; dp[x]++; dp[y]--; } dfs4(1,1); for (int i=1;i<=m;i++) { if (comp[edg[i].ff] == comp[edg[i].ss]) { cout << 'B'; continue; } int swp = 0; if (anc(comp[edg[i].ff],comp[edg[i].ss])) swap(edg[i].ff,edg[i].ss),swp = 1; if (dp[comp[edg[i].ff]] == 0) { cout << 'B'; continue; } char up = 'R'; char down = 'L'; if (swp) swap(up,down); cout << ((dp[comp[edg[i].ff]] == 1) ? up : down); } cout << '\n'; } int32_t main() { ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); #ifdef Dodi freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif int t = 1; //cin >> t; while (t --> 0) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...