Submission #1204480

#TimeUsernameProblemLanguageResultExecution timeMemory
1204480PlayVoltzOne-Way Streets (CEOI17_oneway)C++20
100 / 100
302 ms61100 KiB
#include <iostream>
#include <map>
#include <vector>
#include <climits>
#include <stack>
#include <string>
#include <queue>
#include <algorithm>
#include <set>
#include <unordered_set>
#include <unordered_map>
#include <cmath>
#include <cctype>
#include <bitset>
#include <iomanip>
#include <cstring>
#include <numeric>
using namespace std;

#define int long long
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define fi first
#define se second

struct trio{
	int a, b, c;
};

int counter=0;
vector<vector<trio> > graph;
vector<int> low, disc, ans, in, out, l, r;
vector<set<int> > s;

void dfs(int node, int par, int d){
	disc[node]=low[node]=d;
	in[node]=++counter;
	for (auto [i, j, dir]:graph[node]){
		if (j==par)continue;
		if (disc[i])low[node]=min(low[node], disc[i]);
		else{
			dfs(i, j, d+1);
			low[node]=min(low[node], low[i]);
			if (low[i]>=disc[i]&&!s[i].empty()){
				int c=*s[i].begin();
				if (in[i]<=in[l[c]]&&out[i]>=out[l[c]])ans[j]=dir;
				else ans[j]=(dir==1?2:1);
			}
			if (s[i].size()>s[node].size())swap(s[i], s[node]);
			for (auto a:s[i]){
				if (s[node].find(a)==s[node].end())s[node].insert(a);
				else s[node].erase(a);
			}
		} 
	}
	out[node]=counter;
}

int32_t main(){
	int n, m, q, a, b;
	cin>>n>>m;
	graph.resize(n+1);
	low.resize(n+1);
	disc.resize(n+1, 0);
	ans.resize(m, 0);
	in.resize(n+1);
	out.resize(n+1);
	s.resize(n+1);
	for (int i=0; i<m; ++i){
		cin>>a>>b;
		graph[a].pb({b, i, 1});
		graph[b].pb({a, i, 2});
	}
	cin>>q;
	l.resize(q);
	r.resize(q);
	for(int i=0; i<q; ++i){
		cin>>a>>b;
		if (a==b)continue;
		s[a].insert(i);
		s[b].insert(i);
		l[i]=a, r[i]=b;
	}
	for (int i=1; i<=n; ++i)if (!disc[i])dfs(i, -1, 1);
	for (int i=0; i<m; ++i){
		if (!ans[i])cout<<'B';
		else if (ans[i]==1)cout<<'L';
		else cout<<'R';
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...