제출 #570895

#제출 시각아이디문제언어결과실행 시간메모리
570895bojackduyOne-Way Streets (CEOI17_oneway)C++14
0 / 100
43 ms59148 KiB
#include<iostream> #include<queue> #include<stack> #include<set> #include<algorithm> #include<string.h> #include<map> #define int long long #define size() size() * 1ll #define all(x) (x).begin(), (x).end() #define allr(x, sz) (x) + 1, (x) + 1 + sz #define pb push_back #define pii pair<int,int> #define fi first #define se second #define MASK(x) (1LL<<(x)) #define BIT(x,i) (((x)>>(i))&1) #define numbit(x) __builtin_popcountll(x) using namespace std; const int N = 1e5 + 1; const int M = 1e3 + 1; const long long mod = 1e9 + 7; const long long oo = 1e18 + 7; typedef vector<int> vi; typedef vector<pii> vii; typedef long long ll; template<class t> bool mini(t &x,t y) { if (x > y) { x = y; return 1; } return 0; } template<class t> bool maxi(t &x,t y) { if (x < y) { x = y; return 1; } return 0; } void file() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); //freopen(task.in, r, stdin); //freopen(task.out, w, stdout); return ; } int n, m, p; pii e[N]; vi a[N], adj[N]; map<pii, int> mp, mp1; stack<int> st; int num[N], low[N]; void dfs(int u, int chu) { st.push(u); num[u] = low[u] = ++num[0]; for (auto v: a[u]) if (v != chu) { if (num[v]) mini(low[u], num[v]); else { dfs(v, u); mini(low[u], low[v]); } } if (num[u] == low[u]) { int v; low[0]++; do { v = st.top(), st.pop(); num[v] = low[v] = mod + low[0]; } while (v != u); } } int par[N][31], d[N]; void dfs1(int u, int chu) { par[u][0] = chu; for (auto v: adj[u]) if (v != chu) { d[v] = d[u] + 1; dfs1(v, u); } } int dp[N]; void dfs2(int u, int chu) { for (auto v: adj[u]) if (v != chu) { dfs2(v, u); dp[u] += dp[v]; } } void solve(int test = -1) { cin >> n >> m; for (int i = 1; i <= m; i++) { int x, y; cin >> x >> y; a[x].pb(y); a[y].pb(x); e[i] = pii(x, y); } dfs(1, -1); num[0] = 0; for (int i = 1; i <= n; i++) { num[i] = 0; for (auto v: a[i]) { if (low[i] != low[v]) { adj[low[i] - mod].pb(low[v] - mod); } } } memset(par, -1, sizeof par); dfs1(1, 0); for (int j = 1; MASK(j) <= low[0]; j++) { for (int i = 1; i <= low[0]; i++) { par[i][j] = par[par[i][j - 1]][j - 1]; } } cin >> p; for (int i = 1; i <= p; i++) { int x, y; cin >> x >> y; x = low[x] - mod; y = low[y] - mod; dp[x]++; dp[y]--; } dfs2(1, 0); for (int i = 2; i <= low[0]; i++) { int u = par[i][0]; mp[pii(i, u)] = dp[i]; mp[pii(u, i)] = -dp[i]; } for (int i = 1; i <= n; i++) { for (auto v: a[i]) { mp1[pii(i, v)] = mp[pii(low[i] - mod, low[v] - mod)]; } } for (int i = 1; i <= m; i++) { int u = e[i].fi; int v = e[i].se; cout << (mp1[pii(u, v)] == 0 ? "B" : mp1[pii(u, v)] > 0 ? "R" : "L"); } } int32_t main() { file(); int T = 1; // cin >> T; for (int i = 1; i <= T; i++) { solve(i); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...