Submission #1226907

#TimeUsernameProblemLanguageResultExecution timeMemory
1226907lukasuliashviliOne-Way Streets (CEOI17_oneway)C++20
100 / 100
138 ms32948 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define rep(i, a, b) for(int i = a; i <= b; i++) const int N = 100123, LOG = 18; const int64_t INF = 3e18; int n, m, p, dep[N], low[N], col[N], anc[LOG][N], up[N], down[N]; bool bridge[N], vis[N]; int u[N], v[N], dir[N]; int hd[N], nxt[2 * N], to[2 * N], id[2 * N], ecnt = 0; void add(int a, int b, int i) { to[++ecnt] = b; id[ecnt] = i; nxt[ecnt] = hd[a]; hd[a] = ecnt; to[++ecnt] = a; id[ecnt] = i; nxt[ecnt] = hd[b]; hd[b] = ecnt; } void dfs1(int x, int par, int pid) { vis[x] = 1; if (par == -1) dep[x] = 0; low[x] = dep[x]; for (int i = hd[x]; i; i = nxt[i]) { int y = to[i], idx = id[i]; if (idx == pid) continue; if (!vis[y]) { dep[y] = dep[x] + 1; dfs1(y, x, idx); low[x] = min(low[x], low[y]); if (low[y] > dep[x]) bridge[idx] = 1; } else if (y != par) { low[x] = min(low[x], dep[y]); } } } void dfs2(int x, int c) { col[x] = c; vis[x] = 1; for (int i = hd[x]; i; i = nxt[i]) { int y = to[i]; if (!bridge[id[i]] && !vis[y]) dfs2(y, c); } } int h[N]; void dfs3(int x, int par) { vis[x] = 1; anc[0][x] = par; rep(i,1,LOG-1) anc[i][x] = anc[i-1][anc[i-1][x]]; for (int i = hd[x]; i; i = nxt[i]) { int y = to[i]; if (!vis[y] && y != par) { h[y] = h[x] + 1; dfs3(y, x); } } up[x] = down[x] = h[x]; } int climb(int x, int d) { rep(i,0,LOG-1) if (d & (1 << i)) x = anc[i][x]; return x; } int get_lca(int a, int b) { if (h[a] < h[b]) swap(a, b); a = climb(a, h[a] - h[b]); if (a == b) return a; for (int i = LOG - 1; i >= 0; i--) { if (anc[i][a] != anc[i][b]) { a = anc[i][a]; b = anc[i][b]; } } return anc[0][a]; } void dfs4(int x, int par, int pid = 0) { vis[x] = 1; for (int i = hd[x]; i; i = nxt[i]) { int y = to[i], idx = id[i]; if (y != par && !vis[y]) { dfs4(y, x, idx); up[x] = min(up[x], up[y]); down[x] = min(down[x], down[y]); } } if (pid) { int a = col[u[pid]], b = col[v[pid]]; if (up[x] != h[x]) dir[pid] = (a == par ? 1 : 2); else if (down[x] != h[x]) dir[pid] = (a == par ? 2 : 1); else dir[pid] = 0; } } signed main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m; rep(i,1,m) { cin >> u[i] >> v[i]; add(u[i], v[i], i); bridge[i] = dir[i] = 0; } fill(begin(vis), end(vis), 0); rep(i,1,n) if (!vis[i]) dfs1(i, -1, -1); fill(begin(hd), end(hd), 0); ecnt = 0; fill(begin(vis), end(vis), 0); rep(i,1,m) if (!bridge[i]) add(u[i], v[i], i); int comp = 0; rep(i,1,n) if (!vis[i]) dfs2(i, ++comp); fill(begin(hd), end(hd), 0); ecnt = 0; fill(begin(vis), end(vis), 0); rep(i,1,n) h[i] = up[i] = down[i] = INF; rep(i,1,m) if (bridge[i]) add(col[u[i]], col[v[i]], i); rep(i,1,comp) if (!vis[i]) h[i] = 0, dfs3(i, i); cin >> p; rep(i,1,p) { int a, b; cin >> a >> b; a = col[a]; b = col[b]; if (a == b) continue; int c = get_lca(a, b); up[b] = min(up[b], h[c]); down[a] = min(down[a], h[c]); } fill(begin(vis), end(vis), 0); rep(i,1,comp) if (!vis[i]) dfs4(i, i); rep(i,1,m) { if (dir[i] == 1) cout << "R"; else if (dir[i] == 2) cout << "L"; else cout << "B"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...