Submission #1006234

#TimeUsernameProblemLanguageResultExecution timeMemory
1006234LOLOLOOne-Way Streets (CEOI17_oneway)C++17
100 / 100
122 ms29268 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define f first #define s second #define pb push_back #define ep emplace #define eb emplace_back #define lb lower_bound #define ub upper_bound #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define uniquev(v) sort(all(v)), (v).resize(unique(all(v)) - (v).begin()) #define mem(f,x) memset(f , x , sizeof(f)) #define sz(x) (ll)(x).size() #define __lcm(a, b) (1ll * ((a) / __gcd((a), (b))) * (b)) #define mxx *max_element #define mnn *min_element #define cntbit(x) __builtin_popcountll(x) #define len(x) (int)(x.length()) const int N = 1e5 + 1e3; int n, m; bool is[N]; int low[N], num[N], timeDfs = 1; vector <pair <int, int>> g[N]; void dfs(int u, int pre) { num[u] = low[u] = ++timeDfs; for (auto x : g[u]) { if (x.s == pre) continue; if (num[x.f] == 0) { dfs(x.f, x.s); low[u] = min(low[u], low[x.f]); if (low[x.f] == num[x.f]) { is[x.s] = 1; } } else low[u] = min(low[u], num[x.f]); } } char ans[N]; int u[N], v[N]; struct DSU{ vector <int> p, sz; void ass(int n) { p.assign(n + 1, 0); sz.assign(n + 1, 1); } int get(int a) { return p[a] ? get(p[a]) : a; } void unite(int a, int b) { a = get(a), b = get(b); if (a == b) return; if (sz[a] < sz[b]) swap(a, b); sz[a] += sz[b]; p[b] = a; } }; vector <pair <int, int>> ed[N]; int p[N][20], in[N], ou[N], timer = 1, up[N], down[N], used[N]; void dfs1(int u, int v) { p[u][0] = v; for (int j = 1; j < 20; j++) p[u][j] = p[p[u][j - 1]][j - 1]; in[u] = ++timer; for (auto x : ed[u]) { if (x.f == v) continue; dfs1(x.f, u); } ou[u] = timer; } int anc(int a, int b) { return in[a] <= in[b] && ou[a] >= in[b]; } int lca(int a, int b) { if (anc(a, b)) return a; if (anc(b, a)) return b; for (int j = 19; j >= 0; j--) { if (anc(p[a][j], b) == 0) a = p[a][j]; } return p[a][0]; } void dfs2(int t, int id) { used[t] = 1; if (down[in[t] - 1] != down[ou[t]]) { if (v[id] == t) { ans[id] = 'R'; } else { ans[id] = 'L'; } } if (up[in[t] - 1] != up[ou[t]]) { if (u[id] == t) { ans[id] = 'R'; } else { ans[id] = 'L'; } } for (auto x : ed[t]) { if (x.s == id) continue; dfs2(x.f, x.s); } } int main() { cin >> n >> m; for (int i = 1; i <= m; i++) { cin >> u[i] >> v[i]; g[u[i]].push_back({v[i], i}); g[v[i]].push_back({u[i], i}); } for (int i = 1; i <= n; i++) if (!num[i]) dfs(i, 0); DSU D; D.ass(n + 1); for (int i = 1; i <= m; i++) { ans[i] = 'B'; if (is[i] == 0) { D.unite(u[i], v[i]); } } for (int i = 1; i <= m; i++) { if (is[i]) { u[i] = D.get(u[i]), v[i] = D.get(v[i]); ed[u[i]].pb({v[i], i}); ed[v[i]].pb({u[i], i}); } } for (int i = 1; i <= n; i++) { int t = D.get(i); if (sz(ed[t]) && in[t] == 0) dfs1(t, t); } int p; cin >> p; for (int i = 0; i < p; i++) { int a, b; cin >> a >> b; a = D.get(a), b = D.get(b); if (a == b) continue; int c = lca(a, b); up[in[a]]++, up[in[c]]--; down[in[b]]++, down[in[c]]--; } for (int i = 1; i < N; i++) { up[i] += up[i - 1]; down[i] += down[i - 1]; } for (int i = 1; i <= n; i++) { int t = D.get(i); if (used[t] == 0) dfs2(t, 0); } for (int i = 1; i <= m; i++) { cout << ans[i]; } cout << '\n'; } /* 5 6 1 2 1 2 4 3 2 3 1 3 5 1 2 4 5 1 3 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...