제출 #1246378

#제출 시각아이디문제언어결과실행 시간메모리
1246378ThunnusOne-Way Streets (CEOI17_oneway)C++20
100 / 100
96 ms31776 KiB
#include <bits/stdc++.h> #define long long long #define vi vector<int> #define vvi vector<vi> using namespace std; const int N = (int) 1E5; int t[N], c; vector<int> a[N]; /* namespace BCC { int n, timer = 0; vi tin(N, -1), low(N); stack<int> s; vvi adj(N); inline void add(int a, int b){ adj[a].emplace_back(b); adj[b].emplace_back(a); return; } inline void dfs(int v, int p){ tin[v] = low[v] = ++timer; for(int &u : adj[v]){ if(u == p) continue; if(tin[u] != -1){ low[v] = min(low[v], tin[u]); } else{ dfs(u, v); low[v] = min(low[v], low[u]); } } if(low[v] == tin[v]){ while(s.top() != v){ t[s.top()] = c; a[c].emplace_back(s.top()); s.pop(); } t[s.top()] = c; a[c++].emplace_back(s.top()); s.pop(); } return; } inline void solve(int p){ n = p; for(int i = 0; i < n; i++){ if(tin[i] == -1){ dfs(i, i); } } return; } }; */ namespace BCC { int n; int d[N], f[N], x; vector<int> e[N]; stack<int> s; void add(int u, int v) { e[u].push_back(v); e[v].push_back(u); } void DFS(int u, int p = 0 - 1) { d[u] = x; x = x + 1; f[u] = d[u]; s.push(u); int o = 0; for (auto v : e[u]) { if (v == p && o == 0) { o = 1; continue; } if (d[v] < 0) { DFS(v, u); f[u] = min(f[u], f[v]); } else { f[u] = min(f[u], d[v]); } } if (f[u] == d[u]) { while (s.top() != u) { t[s.top()] = c; a[c].push_back(s.top()); s.pop(); } t[s.top()] = c; a[c].push_back(s.top()); s.pop(); c = c + 1; } } void solve(int p) { n = p; fill(d, d + n, 0 - 1); for (int u = 0; u < n; u++) { if (d[u] < 0) { DFS(u); } } } }; int n, m; vector<array<int, 3>> e[N]; int k; char s[N]; int p[N], d[N]; vector<array<int, 3>> E[N]; void DFS(int u) { for (auto A : E[u]) { int v = A[0], i = A[1], x = A[2]; if (v != p[u]) { p[v] = u; DFS(v); if (d[v] > 0) { s[i] = (x > 0 ? 'R' : 'L'); } if (d[v] < 0) { s[i] = (x > 0 ? 'L' : 'R'); } d[u] = d[u] + d[v]; } } if (p[u] < 0) { assert(d[u] == 0); } } void solve() { cin >> n >> m; for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; u = u - 1, v = v - 1; e[u].push_back({v, i, 0}); e[v].push_back({u, i, 1}); BCC::add(u, v); } BCC::solve(n); for (int u = 0; u < n; u++) { for (auto A : e[u]) { int v = A[0], i = A[1], x = A[2]; if (t[u] != t[v] && x == 0) { E[t[u]].push_back({t[v], i, 0}); E[t[v]].push_back({t[u], i, 1}); } } } cin >> k; for (int i = 0; i < k; i++) { int u, v; cin >> u >> v; u = u - 1, v = v - 1; d[t[u]] = d[t[u]] + 1; d[t[v]] = d[t[v]] - 1; } fill(s, s + m, 'B'); fill(p, p + c, 0 - 1); for (int u = 0; u < c; u++) { if (p[u] < 0) { DFS(u); } } for (int i = 0; i < m; i++) { cout << s[i]; } cout << "\n"; } int main() { ios::sync_with_stdio(0); cin.tie(nullptr); int t; t = 1; for (int i = 0; i < t; i++) { solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...