Submission #1130738

#TimeUsernameProblemLanguageResultExecution timeMemory
1130738mmdrzadaOne-Way Streets (CEOI17_oneway)C++17
0 / 100
7 ms9800 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; template<class T> using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>; typedef vector<int> vi; typedef pair<int, int> pii; typedef long long ll; #define sep ' ' #define F first #define S second #define fastIO ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define pb push_back #define kill(x) {cout << x << endl;return;} #define sz(x) int(x.size()) #define SP(x) setprecision(x) #define mod(x) (1ll*x%M+M)%M #define p_q priority_queue #define REP(i, k) for (int i = 0 ; i < k ; i ++) mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int N = 1e5+10; const int lgn = 18; int n, m, p; int dp_b[N], dp_p[N]; int w[N]; int h[N]; bool vis[N]; int par[N][lgn]; map<pair<int, int>, char> ans; vi adj[N]; void dfs(int v, int p=-1) { vis[v] = true; par[v][0] = p; for(int i = 1 ; par[v][i-1] != -1 ; i ++) par[v][i] = par[par[v][i-1]][i-1]; h[v] = (p == -1 ? 0 : h[p] + 1); for(int neigh: adj[v]) { if (!vis[neigh]) { dfs(neigh, v); } } } int lca(int u, int v) { if (h[u] < h[v]) swap(u, v); for(int delta = h[u] - h[v], i = 0 ; i < lgn ; i ++) { if ((delta>>i)&1) { u = par[u][i]; } } if (u == v) return u; for(int i = lgn-1 ; i >= 0 ; i --) { if (par[v][i] != par[v][i]) { u = par[u][i], v = par[v][i]; } } return par[u][0]; } void gfs(int v, int p = -1) { vis[v] = true; w[v] = h[v]; for(int neigh: adj[v]) { if (!vis[neigh]) { gfs(neigh, v); dp_b[v] += dp_b[neigh]; dp_p[v] += dp_p[neigh]; w[v] = min(w[v], w[neigh]); } else if (neigh != p) w[v] = min(w[v], h[neigh]); } if (p != -1 && w[v] == h[v]) { if (dp_p[v]) { ans[{p, v}] = 'R'; ans[{v, p}] = 'L'; } if (dp_b[v]) { ans[{p, v}] = 'L'; ans[{v, p}] = 'R'; } } } void solve() { memset(par, -1, sizeof par); vector<pii> E; cin >> n >> m; for(int i = 0 ; i < m ; i ++) { int u, v; cin >> u >> v; u--, v--; adj[u].pb(v), adj[v].pb(u); E.pb({u, v}); } for(int i = 0 ; i < n ; i ++) { if (!vis[i]) dfs(i); } cin >> p; for(int i = 0 ; i < p ; i ++) { int x, y; cin >> x >> y; x--, y--; int z = lca(x, y); dp_b[x]++, dp_p[y]++, dp_b[z]--, dp_p[z]--; } fill(vis, vis+n, false); for(int i = 0 ; i < n ; i ++) { if (!vis[i]) gfs(i); } for(auto [u, v]: E) { if (ans.count({u, v})) { cout << ans[{u, v}]; } else if (ans.count({v, u})) { cout << ans[{v, u}]; } else cout << 'B'; } cout << endl; } // check MAXN int32_t main() { fastIO; solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...