Submission #1131233

#TimeUsernameProblemLanguageResultExecution timeMemory
1131233aram.hosnaOne-Way Streets (CEOI17_oneway)C++20
0 / 100
16 ms21568 KiB
/* KHODA HAST */ #include <bits/stdc++.h> using namespace std; typedef long long ll ; typedef pair<ll , ll > pii ; const ll mod = 1e9 +7; const ll inf = 8e18; const int N = 3e5+12 ; #define s second #define f first #define pb push_back #define ms(x , y) memset(x , y , sizeof x) #define ret(x) cout << x << endl ,exit(0) ; ll pw(ll a, ll b, ll md = mod){ll res = 1;while(b){if(b&1){res=(a*res)%md;}a=(a*a)%md;b>>=1;}return(res);} vector <pii> adj[N] , adj2[N] ; vector <int> vh[N] ; bool bor[N] , sn[N] ; int mol[N] , r[N] , l[N] , t = 0 , h[N] , tim = 0 , st[N] , ps[2][N] , y[2][N] , ps1[N] , thes[N]; int n , m ; void dfs(int v , int p, int y ){ sn[v] = 1 ; for(pii u : adj[v]){ if(!sn[u.f]){ h[u.f] = h[v]+1 ; dfs(u.f , v , u.s) ; ps1[v]+=ps1[u.f] ; } if(sn[u.f] && u.f != p && h[u.f] < h[v] ){ ps1[u.f]-- ; ps1[v]++ ; } } if(ps1[v] == 0 && p!=0 ){ bor[y] = 1 ; } } void dfs2(int v){ sn[v] = 1 ; mol[v] = t ; for(pii u : adj[v]){ if(!sn[u.f] && !bor[u.s])dfs2(u.f); } } void dfs3(int v) { sn[v] = 1 ; for(pii u : adj[v]){ if(!sn[u.f]) { if(bor[u.s]){ adj2[mol[u.f]].pb({mol[v] , u.s}) ; adj2[mol[v]].pb({mol[u.f] , u.s}) ; } dfs3(u.f) ; } } } void dfs4(int v){ sn[v] = 1 ; thes[tim] = v ; vh[h[v]].pb(tim) ; tim++; for(pii u : adj2[v]){ if(!sn[u.f]){ h[u.f] = h[v]+1 ; dfs4(u.f) ; } } tim++; return ; } void dfs5(int v ){ sn[v] = 1 ; for(pii u : adj2[v]){ if(!sn[u.f]){ ps[0][u.f] += ps[0][v] ; dfs5(u.f) ; ps[1][v] += ps[1][u.f] ; y[1][u.s] = u.f ; y[0][u.s] = v ; } } return ; } int the_jad(int v , int k ){ if(vh[h[v] - k ].size() == 0 || h[v] < k )return -1 ; auto u = upper_bound(vh[h[v] - k ].begin() , vh[h[v] - k ].end() , st[v]) - vh[h[v] - k].begin(); u = vh[h[v] - k ][u] ; return thes[u] ; } int lca(int x , int y){ int l = 0 , r = n+1 , md ; while(r - l > 1){ md = (l+r)/2 ; if(the_jad(x , md) == the_jad(y , md) || the_jad(x , md) == -1 || the_jad(y , md) == -1 ){ r = md ; } else l = md ; } return the_jad(x , r) ; } void solve(){ cin >> n >> m ; fill(sn , sn+n+ 1 , 0 ) ; for(int i = 0 ; i <= n ; i++){ st[i] = 0 ; thes[i] = 0 ; } for(int i = 1 ; i <= m ; i++){ int v , u ; cin >> v >> u ; adj[u].pb({v , i}); adj[v].pb({u , i}); r[m] = u , l[m] = v; } h[1] = 0 ; dfs(1 , 0 , 0 ) ; fill(sn , sn+n+ 1 , 0 ) ; for(int i = 1 ; i <= n ; i++) if(!sn[i]){t++; dfs2(i) ; } fill(sn , sn+n+ 1 , 0 ) ; dfs3(1) ; fill(sn , sn+n+1 , 0) ; fill(h , h+n+1 , 0 ) ; dfs4(1) ; int p ; cin >> p ; while(p--){ int x , y ; cin >> x >> y ; x = mol[x] ; y = mol[y] ; if(x == y)continue ; int p = lca(x , y ) ; ps[1][x]++ ; ps[1][p]--; ps[0][y]--; ps[0][p]++; } fill(sn , sn+n+1 , 0) ; dfs5(1) ; string ans = "" ; for(int i = 1 ; i <= m ; i++){ int up = y[1][i] , dw = y[0][i] ; if(bor[i] == 1 ) { if(ps[1][up] > 0 ){ if(r[i] == up )ans+='L' ; else ans+='R' ; } else if(ps[0][dw] > 0){ if(r[i] == dw )ans+='L' ; else ans+='R' ; } } else ans+='B' ; } cout << ans << endl; } int main(){ cin.tie(0)->sync_with_stdio(0) ; solve() ; return 0 ; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...