제출 #570919

#제출 시각아이디문제언어결과실행 시간메모리
570919bojackduyOne-Way Streets (CEOI17_oneway)C++14
0 / 100
12 ms13652 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); } } const int K = 30; int cha[N], h[N], sub[N], heavy[N], head[N], pos[N]; void dfs1(int u, int chu) { sub[u] = 1; cha[u] = chu; int cmax = -1; for (auto v: adj[u]) if (v != chu) { dfs1(v, u); maxi(h[u], h[v] + 1); sub[u] += sub[v]; if (maxi(cmax, sub[v])) { heavy[u] = v; } } } void hld(int u, int h) { pos[u] = ++pos[0]; num[pos[0]] = u; head[u] = h; if (heavy[u]) hld(heavy[u], h); for (auto v: adj[u]) if (v != cha[u]) { if (v != heavy[u]) hld(v, v); } } int lca(int a, int b) { while (head[a] != head[b]) { if (h[head[a]] < h[head[b]]) swap(a, b); a = cha[head[a]]; } if (h[a] < h[b]) swap(a, b); return a; } struct IT { int n; vii st; IT(const int &_n = 0): n(_n + 1), st(4 *_n + 1, pii(0, 0)) {} void down(int id) { int x = st[id].se; if (x == 0) return ; st[id << 1].fi = x; st[id << 1].se = x; st[id << 1 | 1].fi = x; st[id << 1 | 1].se = x; x = 0; } int merge(int x, int y) { if (x == 0) return y; return x; } void adj(int id, int l, int r, int u, int v, int val) { if (r < u || v < l) return ; if (u <= l && r <= v) { st[id].fi = val; st[id].se = val; return ; } int mid = (l + r) >> 1; down(id); adj(id << 1, l, mid, u, v, val); adj(id << 1 | 1, mid + 1, r, u, v, val); st[id].fi = merge(st[id << 1].fi, st[id << 1 | 1].fi); } int get(int id, int l, int r, int i) { if (r < i || i < l) return 0; if (l == r) return st[id].fi; int mid = (l + r) >> 1; down(id); return merge(get(id << 1, l, mid, i), get(id << 1 | 1, mid + 1, r, i)); } } it; void lef(int a, int b) { while (head[a] != head[b]) { int x = head[a]; it.adj(1, 1, n, pos[x], pos[a], 1); a = cha[x]; } it.adj(1, 1, n, pos[b], pos[a], 1); } void rig(int a, int b) { while (head[a] != head[b]) { int x = head[a]; it.adj(1, 1, n, pos[x], pos[a], -1); a = cha[x]; } it.adj(1, 1, n, pos[b], pos[a], -1); } 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); } for (int i = 1; i <= n; i++) if (!num[i]) dfs(1, 0); 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); } } } for (int i = 1; i <= low[0]; i++) { dfs1(i, 0); hld(i, 0); } it = IT(low[0]); cin >> p; for (int i = 1; i <= p; i++) { int x, y; cin >> x >> y; x = low[x] - mod; y = low[y] - mod; int par = lca(x, y); lef(x, par); rig(y, par); } for (int i = 2; i <= n; i++) { int v = num[i]; int u = cha[v]; int x = it.get(1, 1, n, i); mp[pii(v, u)] = x; mp[pii(u, v)] = -x; } 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)] == 1 ? "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...