Submission #939729

#TimeUsernameProblemLanguageResultExecution timeMemory
939729vjudge1One-Way Streets (CEOI17_oneway)C++17
0 / 100
3091 ms11432 KiB
#pragma GCC optimize("Ofast,unroll-loops") #pragma GCC target("avx,avx2,fma") #include <bits/stdc++.h> #define ff first #define ss second #define pb push_back #define all(x) x.begin(),x.end() #define rall(x) x.rbegin(),x.rend() using namespace std; int pow(int a,int b,int m){int ans=1;while(b){if(b&1){ans=(ans*a)%m;}b>>=1;a=(a*a)%m;}return ans;} int binpow(int a,int b){int ans=1;while(b){if(b&1){ans=(ans*a);}b>>=1;a=(a*a);}return ans;} const int N = 1e5 + 10; int fup[N], h[N]; vector <int> g[N]; vector <int> gc[N]; int lead[N]; int vis[N], par[N]; int tin[N], tout[N], up[N][25], used[N]; int timer; map <pair <int,int>, int > brid; void dfsc(int v){ vis[v] = 1; for(auto to : g[v]){ if(vis[to] == 0 && !brid.count({v, to})){ lead[to] = lead[v]; dfsc(to); } } } void dfs2(int v, int p = 1) { tin[v] = ++timer; par[v] = p; up[v][0] = p; for (int i=1; i<=20; ++i) up[v][i] = up[up[v][i-1]][i-1]; for (auto to : gc[v]) { if (to == p)continue; //cout <<p<<"->"<< v <<"->" << to << endl; dfs2 (to, v); } tout[v] = ++timer; } bool upper (int a, int b) { return tin[a] <= tin[b] && tout[a] >= tout[b]; } int lca (int a, int b) { if (upper (a, b)) return a; if (upper (b, a)) return b; for (int i=20; i>=0; --i) if (! upper (up[a][i], b)) a = up[a][i]; return up[a][0]; } void dfs (int v, int p = -1) { used[v] = true; tin[v] = fup[v] = timer++; for (size_t i=0; i<g[v].size(); ++i) { int to = g[v][i]; if (to == p) continue; if (used[to]) fup[v] = min (fup[v], tin[to]); else { dfs (to, v); fup[v] = min (fup[v], fup[to]); if (fup[to] > tin[v]){ brid[{v, to}] = 1; brid[{to, v}] = 1; } } } } main(){ iostream::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n, m; cin >> n >> m; vector <pair <int,int> > road; for(int i = 0; i < m; i++){ int a, b; cin >> a >> b; g[a].pb(b); g[b].pb(a); road.pb({a, b}); } for(int i = 1; i<= n; i++){ if(!used[i])dfs(i, i); } for(int i = 1; i <= n; i++){ if(vis[i] == 0){ lead[i] = i; dfsc(i); } } for(auto x : road){ if(brid.count(x)){ //cout << "===" << x.ff <<" "<< x.ss <<" "<< lead[x.ff] <<" "<< lead[x.ss]<< endl; gc[lead[x.ff]].pb(lead[x.ss]); gc[lead[x.ss]].pb(lead[x.ff]); } } memset(used, 0, sizeof(used)); for(int i = 1; i <= n; i++){ if(par[i] == 0){ dfs2(i, i); } } int p; cin >> p; map <pair <int,int>, int> mp; while(p--){ int a, b; cin >> a >> b; a = lead[a]; b = lead[b]; if(a == b)continue; int lc = lca(a, b); while(a != lc){ //cout << "--"<<a << endl; if(par[a] == 0)return EXIT_FAILURE; mp[{lead[a], par[lead[a]]}] = 1; a = par[lead[a]]; } while(b != lc){ //cout << "---" << b <<" "<< par[b]<< endl; if(par[b] == 0)return EXIT_FAILURE; mp[{par[lead[b]], lead[b]}] = 1; b = par[lead[b]]; } } for(auto x : road){ int f = x.ff, s = x.ss; f = lead[f]; s = lead[s]; if(mp.count({f, s})){ cout << 'R'; }else if(mp.count({s, f})){ cout << 'L'; }else cout << 'B'; } }

Compilation message (stderr)

oneway.cpp:86:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   86 | main(){
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...