Submission #938390

#TimeUsernameProblemLanguageResultExecution timeMemory
938390vjudge1One-Way Streets (CEOI17_oneway)C++17
60 / 100
3020 ms21820 KiB
#include <bits/stdc++.h>
using namespace std;
#define ff first
#define ss second
#define all(a) a.begin(), a.end()
const int N = 2e5;
const int mod = 1e9 + 7;

/*
5 5
1 2
1 2
4 3
2 3
4 5
2
4 5
1 3
*/

signed main(){
	int n, m; cin >> n >> m;
	vector<int> g[n+1];
	vector<pair<int, int> > edge;
	for(int i = 1;i <= m; i++){
		int a, b; cin >> a >> b;
		edge.push_back({a, b});
		g[a].push_back(b);
		g[b].push_back(a);
	}
	int q; cin >> q;
	vector<pair<int, int> > Q(q);
	for(int i = 0;i < q; i++){
		cin >> Q[i].ff >> Q[i].ss;
	}
	vector<int> in(n+1, -1), out(n+1, -1);
	vector<char> ans(m, '#');
	vector<int> par(n+1);
	vector<int> used(n+1, 0);
	int timer = 1;
	map<pair<int, int>, int> mp;
	//cout << "bridges : " << '\n';
	function<void(int, int)> bridges=[&](int v, int p){
		in[v] = timer;
		out[v] = timer++;
		par[v] = p;
		used[v] = 1;
		int flag = 0;
		for(int to : g[v]){
			
			if(!used[to]){
				bridges(to, v);
				out[v] = min(out[v], out[to]);
			}else{
				if(to == p){
					if(flag){
						out[v] = min(out[v], in[to]);
					}
					flag = 1;
				}else
				out[v] = min(out[v], in[to]);
			}
		}
		if(p != -1 && in[v] == out[v]){
			//cout << v << ' ' << p << '\n';
			mp[make_pair(min(v, p), max(v, p))] = 1;
		}
	};
	//cout << '\n';
	for(int i = 1;i <= n; i++){
		if(!used[i]){
			bridges(i, -1);
		}
	}
	for(int i = 0;i < m; i++){
		auto [a, b] = edge[i];
		if(a > b) swap(a, b);
		if(!mp.count({a, b})){
			ans[i] = 'B';
		}
	}
	vector<int> path, check;
	
	function<void(int, int)> dfs=[&](int v, int finish){
		check.push_back(v);
		used[v] = 1;
		if(v == finish){
			path = check;
			return;
		}
		for(int to : g[v]){
			if(used[to]) continue;
			dfs(to, finish);
		}
		check.pop_back();
	};
	set<pair<int, int> > st;
	for(auto [a, b] : Q){
		path.clear();
		check.clear();
		for(int i = 1;i <= n; i++) used[i] = 0;
		dfs(a, b);
		for(int i = 0;i + 1 < (int)path.size(); i++){
			st.insert(make_pair(path[i], path[i+1]));
		}	
	}
	for(int i = 0;i < m; i++){
		if(ans[i] != '#') continue;
		if(st.count(edge[i])){
			ans[i] = 'R';
		}else if(st.count({edge[i].ss, edge[i].ff})){
			ans[i] = 'L';
		}
	}
	for(int i = 0;i < m; i++){
		if(ans[i] == '#') ans[i] = 'B';
		cout << ans[i];
	}
	
	
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...