Submission #305132

#TimeUsernameProblemLanguageResultExecution timeMemory
305132miss_robotOne-Way Streets (CEOI17_oneway)C++14
100 / 100
326 ms40056 KiB
#include <bits/stdc++.h>

#pragma GCC optimize("O3")

using namespace std;

const int N = 1e5+1, L = 17;
int n, m, q, c;
int num[N], low[N], bridge[N], p[L][N], up[N], dir[N], in[N], out[N], height[N];
pair<int, int> e[N];
vector<int> g[N], ind[N];
vector<int> h[N], dni[N];
char sol[N];

void dfs(int u, int l){
	num[u] = low[u] = ++c;
	for(int i = 0, v, x; i < (int)g[u].size(); i++){
		v = g[u][i], x = ind[u][i];
		if(!num[v]){
			dfs(v, x);
			if(low[v] > num[u]) bridge[x] = 1;
			low[u] = min(low[u], low[v]);
		}
		if(x != l) low[u] = min(low[u], num[v]);
	}
}

void fnd(int u){
	if(num[u]) return;
	num[u] = c;
	for(int i = 0, v, x; i < (int)g[u].size(); i++){
		v = g[u][i], x = ind[u][i];
		if(bridge[x]) continue;
		fnd(v);
	}
}

void tree(int u, int l, int d){
	p[0][u] = l;
	height[u] = d++;
	for(int i = 0, v, x; i < (int)h[u].size(); i++){
		v = h[u][i], x = dni[u][i];
		if(v == l){
			up[u] = x;
			if(num[e[x].first] != u) dir[u] = 1;
		}
		else{
			tree(v, u, d);
		}
	}
}

int kth(int u, int k){
	for(int i = L-1; i >= 0; i--)
		if(k >= (1<<i))
			u = p[i][u], k -= (1<<i);
	return u;
}

int lca(int u, int v){
	if(height[u] < height[v]) swap(u, v);
	u = kth(u, height[u]-height[v]);
	if(u == v) return u;
	for(int i = L-1; i >= 0; i--)
		if(p[i][u] != p[i][v])
			u = p[i][u], v = p[i][v];
	return p[0][u];
}

void solve(int u){
	for(int v : h[u]){
		if(v != p[0][u]){
			solve(v);
			in[u] += in[v];
			out[u] += out[v];
		}
	}
	if(out[u]){
		if(dir[u]) sol[up[u]] = 'L';
		else sol[up[u]] = 'R';
	}
	if(in[u]){
		if(dir[u]) sol[up[u]] = 'R';
		else sol[up[u]] = 'L';
	}
}

int main(){
	cin.tie(0);
	ios::sync_with_stdio(0);
	cin >> n >> m;
	for(int i = 0, u, v; i < m; i++){
		cin >> u >> v;
		u--, v--;
		e[i] = {u, v};
		g[u].push_back(v), g[v].push_back(u);
		ind[u].push_back(i), ind[v].push_back(i);
		sol[i] = 'B';
	}
	for(int i = 0; i < n; i++) if(!num[i]) dfs(i, -1);
	c = 0;
	for(int i = 0; i < n; i++) num[i] = 0;
	for(int i = 0; i < n; i++){
		if(num[i]) continue;
		c++;
		fnd(i);
	}
	for(int i = 0, u, v; i < m; i++){
		if(!bridge[i]) continue;
		tie(u, v) = e[i];
		h[num[u]].push_back(num[v]), h[num[v]].push_back(num[u]);
		dni[num[u]].push_back(i), dni[num[v]].push_back(i);
	}
	for(int i = 1; i <= c; i++) if(!p[0][i]) tree(i, i, 0);
	for(int j = 1; j < L; j++)
		for(int i = 1; i <= c; i++)
			p[j][i] = p[j-1][p[j-1][i]];
	cin >> q;
	for(int i = 0, u, v, a; i < q; i++){
		cin >> u >> v;
		u--, v--;
		u = num[u], v = num[v];
		a = lca(u, v);
		out[u]++, out[a]--;
		in[v]++, in[a]--;
	}
	for(int i = 1; i <= c; i++) if(!height[i]) solve(i);
	cout << sol << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...