Submission #563708

#TimeUsernameProblemLanguageResultExecution timeMemory
563708ngpin04One-Way Streets (CEOI17_oneway)C++14
100 / 100
132 ms19860 KiB
#include <bits/stdc++.h> #define fi first #define se second #define mp make_pair #define TASK "" #define bit(x) (1LL << (x)) #define getbit(x, i) (((x) >> (i)) & 1) #define ALL(x) (x).begin(), (x).end() using namespace std; template <typename T1, typename T2> bool mini(T1 &a, T2 b) { if (a > b) {a = b; return true;} return false; } template <typename T1, typename T2> bool maxi(T1 &a, T2 b) { if (a < b) {a = b; return true;} return false; } mt19937_64 rd(chrono::steady_clock::now().time_since_epoch().count()); int rand(int l, int r) { return l + rd() % (r - l + 1); } const int N = 1e5 + 5; const int oo = 1e9; const long long ooo = 1e18; const int mod = 1e9 + 7; // 998244353; const long double pi = acos(-1); vector <int> adj[N]; vector <int> g[N]; vector <int> s; int comp[N]; int tin[N]; int tout[N]; int num[N]; int low[N]; int par[N]; int anc[N]; int fr[N]; int to[N]; int n,m,timer,nComp; bool brd[N]; bool vis[N]; char ans[N]; bool isanc(int u, int p) { return tin[p] <= tin[u] && tin[u] <= tout[p]; } int getpar(int u) { return (par[u] < 0) ? u : (par[u] = getpar(par[u])); } void dfs(int u, int p = -1) { num[u] = low[u] = ++timer; s.push_back(u); for (int i : adj[u]) if (i != p) { int v = fr[i] ^ to[i] ^ u; if (num[v]) { mini(low[u], num[v]); } else { dfs(v, i); mini(low[u], low[v]); } } if (num[u] == low[u]) { nComp++; int v; do { v = s.back(); s.pop_back(); comp[v] = nComp; } while (v != u); } } void solve(int u, int p = -1) { tin[u] = ++timer; anc[u] = p; for (int i : g[u]) if (i != p) { int v = fr[i] ^ to[i] ^ u; solve(v, i); } tout[u] = timer; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); #ifdef ONLINE_JUDGE freopen("oneway.inp","r",stdin); freopen("oneway.out","w",stdout); #endif cin >> n >> m; for (int i = 1; i <= m; i++) { cin >> fr[i] >> to[i]; adj[fr[i]].push_back(i); adj[to[i]].push_back(i); } for (int i = 1; i <= m; i++) ans[i] = 'B'; for (int i = 1; i <= n; i++) if (!num[i]) dfs(i); for (int i = 1; i <= m; i++) { fr[i] = comp[fr[i]]; to[i] = comp[to[i]]; if (fr[i] == to[i]) continue; g[fr[i]].push_back(i); g[to[i]].push_back(i); } for (int i = 1; i <= n; i++) par[i] = -1; timer = 0; for (int i = 1; i <= nComp; i++) if (!tin[i]) solve(i); int q; cin >> q; while (q--) { int u, v; cin >> u >> v; u = comp[u]; v = comp[v]; for (int i = getpar(u); !isanc(v, i);) { int ind = anc[i]; ans[ind] = (fr[ind] == i) ? 'R' : 'L'; int j = fr[ind] ^ to[ind] ^ i; par[i] = j; i = getpar(i); } for (int i = getpar(v); !isanc(u, i);) { int ind = anc[i]; ans[ind] = (fr[ind] == i) ? 'L' : 'R'; int j = fr[ind] ^ to[ind] ^ i; par[i] = j; i = getpar(i); } } 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...