제출 #1302196

#제출 시각아이디문제언어결과실행 시간메모리
1302196LudisseyOne-Way Streets (CEOI17_oneway)C++20
100 / 100
56 ms20556 KiB
#include <bits/stdc++.h> #define int long long #define sz(a) (int)a.size() #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() using namespace std; int n,m,p; vector<int> parent; vector<int> sz; vector<int> ans; vector<int> val; vector<int> visited; vector<bool> isb; vector<vector<pair<int,int>>> neigh; vector<int> tin,low; int timer=0; int getParent(int a){ if(parent[a]==a) return parent[a]; return parent[a]=getParent(parent[a]); } void unite(int a, int b){ a=getParent(a), b=getParent(b); if(a==b) return; if(sz[a]<sz[b]) swap(a,b); sz[a]+=sz[b]; parent[b]=a; } void fb(int x, int p){ if(visited[x]) return; visited[x]=true; bool skipParent=false; tin[x]=low[x]=timer++; for (auto u : neigh[x]) { if(u.first==p&&!skipParent){ skipParent=true; continue; } if(visited[u.first]){ low[x]=min(low[x],low[u.first]); }else{ fb(u.first,x); low[x]=min(low[x],low[u.first]); if(low[u.first]>low[x]) isb[u.second]=true; } } } int dfs(int x, int p){ if(visited[x]) return 0; visited[x]=true; int sm=val[x]; for (auto u : neigh[x]) { int j=max(u.second,-u.second-1); int v=dfs(u.first,p); sm+=v; if(v==0) continue; if((v<0&&u.second>=0)||(v>0&&u.second<0)) ans[j]=1; else ans[j]=2; } return sm; } signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; ans.resize(m); val.resize(n); visited.resize(n); parent.resize(n); sz.resize(n); neigh.resize(n); isb.resize(m,false); tin.resize(n,-1); low.resize(n,-1); vector<pair<int,int>> ed(m); for (int i = 0; i < m; i++) { int a,b; cin >> a >> b; a--; b--; ed[i]={a,b}; neigh[a].push_back({b,i}); neigh[b].push_back({a,i}); } for (int i = 0; i < n; i++) fb(i,i); for (int i = 0; i < n; i++) { parent[i]=i; sz[i]=1; neigh[i].clear(); visited[i]=0; } for (int i = 0; i < m; i++) { if(!isb[i]) unite(ed[i].first,ed[i].second); } for (int i = 0; i < m; i++) { if(isb[i]){ neigh[getParent(ed[i].first)].push_back({getParent(ed[i].second),i}); neigh[getParent(ed[i].second)].push_back({getParent(ed[i].first),-(i+1)}); } } int p; cin >> p; for (int i = 0; i < p; i++) { int a,b; cin >> a >> b; val[getParent(a-1)]++; val[getParent(b-1)]--; } for (int i = 0; i < n; i++) { if(i!=getParent(i)) continue; if(!visited[i]) dfs(i,i); } for (int i = 0; i < m; i++) { if(ans[i]==0) cout << "B"; else if(ans[i]==1) cout << "R"; else cout << "L"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...