제출 #761468

#제출 시각아이디문제언어결과실행 시간메모리
761468vjudge1One-Way Streets (CEOI17_oneway)C++17
100 / 100
111 ms14180 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define f(i,a,b) for(int i = a; i < b; i++) #define fa(i,a,b) for(int i = a; i >= b; i--) const int N = 1e5 + 5; int n, m, q; int U[N], V[N], col, color[N], direction[N], sum[N]; bool is_bridge[N]; int tin[N], tim, low[N], pa[N]; vector <int> adj[N], curr; void dfs(int u, int f){ tin[u] = low[u] = ++tim; curr.push_back(u); pa[u] = f; int r = 0; for(int v: adj[u]){ if(v == f) {r++; continue; } if(tin[v] == 0){ dfs(v, u); low[u] = min(low[u], low[v]); } else low[u] = min(low[u], tin[v]); } if(low[u] == tin[u] and r <= 1) { col++; while(!curr.empty()){ int w = curr.back(); color[w] = col; curr.pop_back(); if(w == u) break; } if(f != 0) is_bridge[u] = 1; } } void DFS(int u, int f){ tin[u] = ++tim; for(int v: adj[u]){ if(v == f) continue; if(tin[v] == 0){ DFS(v, u); sum[u] += sum[v]; } } } int main(){ cin >> n >> m; f(i,0,m){ cin >> U[i] >> V[i]; if(U[i] != V[i]) adj[U[i]].push_back(V[i]), adj[V[i]].push_back(U[i]); } f(i,1,n+1) if(tin[i] == 0) dfs(i, 0); cin >> q; f(i,0,q){ int u, v; cin >> u >> v; if(color[u] != color[v]) sum[u]++, sum[v]--; } tim = 0; f(i,1,n+1) tin[i] = 0; f(i,1,n+1) if(tin[i] == 0) DFS(i, 0); f(i,1,n+1) if(is_bridge[i] and sum[i] != 0) direction[i] = sum[i]/abs(sum[i]); f(i,0,m){ if((pa[U[i]] == V[i] and direction[U[i]] == 1) or (pa[V[i]] == U[i] and direction[V[i]] == -1)) cout << 'R'; else if((pa[U[i]] == V[i] and direction[U[i]] == -1) or (pa[V[i]] == U[i] and direction[V[i]] == 1)) cout << 'L'; else cout << 'B'; } cout << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...