Submission #1309621

#TimeUsernameProblemLanguageResultExecution timeMemory
1309621damamilaOne-Way Streets (CEOI17_oneway)C++20
0 / 100
1 ms332 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define INF 1e18 int n, m, k; vector<vector<pair<int, int>>> g, g2; vector<pair<int, int>> edges; vector<int> num, low, comp; int dfscnt = 0, compcnt = 0; stack<int> s; string ans; vector<vector<int>> jump; vector<int> dep, dp; void tarjan(int u, int p) { if (num[u] != -1) return; // cout << u << " " << p << endl; num[u] = low[u] = dfscnt; dfscnt++; s.push(u); for (auto [v, x] : g[u]) { if (v == p) continue; if (num[v] == -1) { tarjan(v, u); low[u] = min(low[u], low[v]); } else { low[u] = min(low[u], num[v]); } } if (num[u] == low[u]) { int v = s.top(); while (v != u) { s.pop(); comp[v] = compcnt; v = s.top(); } comp[v] = compcnt; s.pop(); compcnt++; } } void dfs(int u, int p, int d) { jump[u][0] = p; dep[u] = d; for (auto [v, x] : g2[u]) { if (v == p) continue; dfs(v, u, d+1); } } void pp() { for (int j = 1; j < 30; j++) { for (int i = 0; i < compcnt; i++) { jump[i][j] = jump[jump[i][j-1]][j-1]; // cout << jump[i][j] << " "; } // cout << endl; } } int lift(int a, int d) { for (int i = 0; i < 30; i++) { if ((1<<i)&d) { a = jump[a][i]; } } return a; } int lca(int a, int b) { if (dep[a] < dep[b]) swap(a, b); a = lift(a, dep[a]-dep[b]); for (int i = 29; i >= 0; i--) { if (jump[a][i] != jump[b][i]) { a = jump[a][i]; b = jump[b][i]; } } if (a != b) a = jump[a][0]; return a; } int dfs2(int u, int p) { // cout << u << " " << p << endl; int cnt = 0; for (auto [v, x] : g2[u]) { if (v == p) continue; int tmp = dfs2(v, u); if (tmp) { // cout << "JAAA: " << v << " " << u << " _ " << edges[x].first << " " << edges[x].second << endl; if (edges[x].first == u) ans[x] = 'R'; else ans[x] = 'L'; } cnt += tmp; } cnt += dp[u]; // cout << u << " " << p << ": " << cnt << endl; return cnt; } signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m; edges = vector<pair<int, int>> (m); g = vector<vector<pair<int, int>>> (n); num = low = comp = vector<int> (n, -1); for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; a--; b--; edges[i] = {a, b}; g[a].push_back({b, i}); g[b].push_back({a, i}); ans.push_back('B'); } tarjan(0, 0); //Find SCCs /* for (int i = 0; i < n; i++) { cout << comp[i] << " "; } cout << endl; */ g2 = vector<vector<pair<int, int>>> (compcnt); jump = vector<vector<int>> (compcnt, vector<int> (30, -1)); dep = vector<int> (compcnt, -1); dp = vector<int> (compcnt, 0); for (int i = 0; i < n; i++) { for (auto [v, x] : g[i]) { if (comp[i] == comp[v]) continue; g2[comp[i]].push_back({comp[v], x}); } } for (int i = 0; i < m; i++) { edges[i] = {comp[edges[i].first], comp[edges[i].second]}; } dfs(0, 0, 0); pp(); cin >> k; for (int i = 0; i < k; i++) { int a, b; cin >> a >> b; a--; b--; int c = lca(comp[a], comp[b]); dp[comp[a]]++; dp[comp[b]]++; dp[c] -= 2; // cout << "C: " << c << endl; } dfs2(0, 0); cout << ans << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...