Submission #1292859

#TimeUsernameProblemLanguageResultExecution timeMemory
1292859NHristovOne-Way Streets (CEOI17_oneway)C++20
100 / 100
56 ms19588 KiB
#include <bits/stdc++.h> #define endl '\n' using namespace std; const int N=1e5+5, M=1e5+5; int n, m, p, a[N], b[N], low[N], dep[N], c[N], d[N]; bool vis[N], bridge[M]; vector<int> g[N], t[N]; struct dsu { int p[N], sz[N]; void init() { for(int i=1; i<=n; i++) p[i]=i, sz[i]=1; } int find(int u) { if(u==p[u]) return u; return p[u]=find(p[u]); } void unite(int u, int v) { if((u=find(u))==(v=find(v))) return; if(sz[u]>sz[v]) swap(u, v); sz[v]+=sz[u], p[u]=v; } } dsu; void dfs(int u, int p) { vis[u]=1; dep[u]=dep[p]+1; low[u]=dep[u]; bool f=0; for(int e : g[u]) { int v=u^a[e]^b[e]; if(v==p&&!f) { f=1; continue; } if(!vis[v]) { dfs(v, u); low[u]=min(low[u], low[v]); if(low[v]>dep[u]) bridge[e]=1; } else low[u]=min(low[u], dep[v]); } } void dfs2(int u, int p) { for(int e : t[u]) { int v=u^a[e]^b[e]; if(v==p) continue; d[v]=d[u]+1; dfs2(v, u); c[u]+=c[v]; } } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m; for(int i=1; i<=m; i++) { cin >> a[i] >> b[i]; g[a[i]].push_back(i); g[b[i]].push_back(i); } dsu.init(); for(int i=1; i<=n; i++) if(!vis[i]) dfs(i, 0); for(int i=1; i<=m; i++) if(!bridge[i]) dsu.unite(a[i], b[i]); for(int i=1; i<=m; i++) { if(bridge[i]) { a[i]=dsu.find(a[i]), b[i]=dsu.find(b[i]); t[a[i]].push_back(i), t[b[i]].push_back(i); } } cin >> p; for(int i=1; i<=p; i++) { int u, v; cin >> u >> v; c[dsu.find(u)]++, c[dsu.find(v)]--; } for(int i=1; i<=n; i++) { if(dsu.p[i]==i&&!d[i]) { d[i]=1; dfs2(i, -1); } } for(int i=1; i<=m; i++) { if(!bridge[i]) { cout << "B"; continue; } int u; if(d[a[i]]>d[b[i]]) u=a[i]; else u=b[i]; if(c[u]==0) cout << "B"; else { if((u==a[i]&&c[u]>0)||(u!=a[i]&&c[u]<0)) cout << "R"; else cout << "L"; } } cout << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...