Submission #518207

#TimeUsernameProblemLanguageResultExecution timeMemory
518207blueOne-Way Streets (CEOI17_oneway)C++17
100 / 100
234 ms35912 KiB
#include <iostream> #include <vector> #include <algorithm> #include <queue> using namespace std; using vi = vector<int>; using vvi = vector<vi>; using pii = pair<int, int>; const int mx = 100'000; int n, m; vi edge[1+mx]; vi nw_edge[1+mx]; vi nw_rev[1+mx]; vi visit(1+mx, 0); vi ee; void dfs(int u, int p) { visit[u] = 1; for(int v: edge[u]) { if(v == p) continue; if(visit[v]) { // cerr << v << " ->* " << u << '\n'; nw_edge[v].push_back(u); nw_rev[u].push_back(v); } else { // cerr << u << " -> " << v << '\n'; nw_edge[u].push_back(v); nw_rev[v].push_back(u); dfs(v, u); } } ee.push_back(u); } vi bcc(1+mx, 0); int ct = 0; vi bcc_list[1+mx]; void dfs2(int u) { bcc[u] = ct; bcc_list[ct].push_back(u); for(int v: nw_rev[u]) { if(bcc[v]) continue; dfs2(v); } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n >> m; vi a(1+m), b(1+m); for(int e = 1; e <= m; e++) { cin >> a[e] >> b[e]; edge[a[e]].push_back(b[e]); edge[b[e]].push_back(a[e]); } for(int u = 1; u <= n; u++) { if(visit[u]) continue; dfs(u, 0); } // for(int u = 1; u <= n; u++) // { // cerr << u << " : "; // for(int v: nw_edge[u]) cerr << v << ' '; // cerr << '\n'; // } reverse(ee.begin(), ee.end()); for(int u: ee) { if(bcc[u]) continue; ++ct; dfs2(u); } // for(int i = 1; i <= ct; i++) // { // for(int u: bcc_list[i]) cerr << u << ' '; // cerr << '\n'; // } vector<pii> bcc_edge[1+ct]; vi deg(1+ct, 0); vector<char> ans(1+m, 'B'); for(int e = 1; e <= m; e++) { if(bcc[a[e]] == bcc[b[e]]) { continue; } bcc_edge[ bcc[a[e]] ].push_back({bcc[b[e]], +e}); bcc_edge[ bcc[b[e]] ].push_back({bcc[a[e]], -e}); deg[bcc[a[e]]]++; deg[bcc[b[e]]]++; } vi score(1+ct, 0); int p; cin >> p; for(int z = 1; z <= p; z++) { int x, y; cin >> x >> y; score[bcc[x]]++; score[bcc[y]]--; } fill(visit.begin(), visit.end(), 0); queue<int> tbv; for(int u = 1; u <= ct; u++) { if(deg[u] == 1) { tbv.push(u); } } while(!tbv.empty()) { int u = tbv.front(); tbv.pop(); deg[u] = -5; // cerr << "u = " << u << " : "; // for(int w: bcc_list[u]) cerr << w << ' '; // cerr << '\n'; for(pii e: bcc_edge[u]) { int v = e.first; int id = e.second; if(deg[v] < 0) continue; deg[v]--; // cerr << "par " << u << " = " << v << '\n'; // cerr << score[u] << '\n'; if(score[u] > 0) { // cerr << "#\n"; if(id > 0) ans[id] = 'R'; else ans[-id] = 'L'; } else if(score[u] < 0) { // cerr << "? " << id << '\n'; if(id > 0) ans[id] = 'L'; else ans[-id] = 'R'; } score[v] += score[u]; score[u] = 0; if(deg[v] == 1) tbv.push(v); } } for(int e = 1; e <= m; e++) cout << ans[e]; cout << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...