Submission #1312967

#TimeUsernameProblemLanguageResultExecution timeMemory
1312967888313666One-Way Streets (CEOI17_oneway)C++20
100 / 100
121 ms30720 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define _ <<' '<< #define print(x) cout<<#x<<": "<<(x)<<'\n' int n,m,q,c=-1,k,d=-1; vector<vector<array<int, 2>>> adj, aj2; vector<array<int, 2>> eg; vector<int> num, low, bg, cmp, up, dp, par, vis, in, out, res; vector<vector<int>> st; void dfs(const int u, const int p) { num[u]=low[u]=++c; bool flag=true; for (const auto [v, i]:adj[u]) { if (v==p && flag) { flag=false; continue; } if (num[v]==-1) { dfs(v, u); low[u]=min(low[u], low[v]); if (low[v]>num[u]) bg[i]=1; } low[u]=min(low[u], num[v]); } } void tj(){ for (int i=0; i<n; i++) if (num[i]==-1) dfs(i, i); } void dfs2(const int u) { cmp[u]=c; for (const auto [v, i]:adj[u]) if (!bg[i] && cmp[v]==-1) { dfs2(v); } } void dfs3(const int u) { vis[u]=1; in[u]=++d; for (const auto [v, i]:aj2[u]) if (!vis[v]) { par[v]=u; dfs3(v); } out[u]=d; } bool anc(const int a, const int b) { return in[a]<=in[b] && out[b]<=out[a]; } int lca(const int a, const int b) { if (anc(a, b)) return a; if (anc(b, a)) return b; int x=a; for (int i=k-1; i>=0; --i) if (!anc(st[i][x], b)) x=st[i][x]; return st[0][x]; } void dfs4(const int u) { vis[u]=1; for (const auto [v, i]:aj2[u]) if (v!=par[u]) { dfs4(v); if (dp[v]) { if (cmp[eg[i][0]]==u) res[i]=1; else res[i]=-1; } else if (up[v]) { if (cmp[eg[i][1]]==u) res[i]=1; else res[i]=-1; } dp[u]+=dp[v]; up[u]+=up[v]; } assert((!up[u]) || (!dp[u])); } int main(){ cin.tie(0)->sync_with_stdio(0); cout.tie(0); cin>>n>>m; adj.resize(n); eg.resize(m); num.assign(n, -1); low.assign(n, -1); bg.assign(m, 0); cmp.assign(n, -1); res.assign(m, 0); for (int i=0; i<m; i++) { int a,b; cin>>a>>b; adj[--a].push_back({--b, i}); adj[b].push_back({a, i}); eg[i]={a, b}; } //cout<<'a'<<endl; tj(); //cout<<'b'<<endl; c=0; for (int i=0; i<n; i++) if (cmp[i]==-1) { dfs2(i); ++c; } //cout<<'c'<<endl; aj2.resize(c); par.assign(c, 0); in.assign(c, -1); out.assign(c, -1); vis.assign(c, 0); for (int i=0; i<m; i++) if (bg[i]) { aj2[cmp[eg[i][0]]].push_back({cmp[eg[i][1]], i}); aj2[cmp[eg[i][1]]].push_back({cmp[eg[i][0]], i}); } //cout<<'d'<<endl; for (int i=0; i<c; i++) if (!vis[i]) { par[i]=i; dfs3(i); } up.assign(c, 0); dp=up; k=max(1, 32-__builtin_clz(c)); //cout<<'e'<<endl; cin>>q; st.assign(k, vector<int>(c, 0)); st[0]=par; for (int i=1; i<k; i++) for (int j=0; j<c; j++) { st[i][j]=st[i-1][st[i-1][j]]; } for (int i=0; i<q; i++) { int a,b; cin>>a>>b; a=cmp[--a]; b=cmp[--b]; const auto l=lca(a, b); ++up[a]; --up[l]; --dp[l]; ++dp[b]; } vis.assign(c, 0); for (int i=0; i<c; i++) if (!vis[i]) dfs4(i); for (const auto e:res) { if (e==-1) cout<<'L'; else if (!e) cout<<'B'; else cout<<'R'; } cout<<'\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...