Submission #1283344

#TimeUsernameProblemLanguageResultExecution timeMemory
1283344Jawad_Akbar_JJOne-Way Streets (CEOI17_oneway)C++20
0 / 100
1 ms332 KiB
#include <iostream>
#include <vector>

using namespace std;
const int N = 1<<17;
vector<pair<int,int>> nei[N];
int hei[N], par[N][20], seen[N], cyc[N], Down[N], Up[N], Ans[N];

void dfs(int u, int p){
	hei[u] = hei[p] + 1, seen[u] = 1, par[u][0] = p;
	for (int i=1;i<17;i++)
		par[u][i] = par[par[u][i-1]][i-1];

	for (auto [i, id] : nei[u]){
		if (seen[i] == 1)
			continue;
		dfs(i, u);
	}
}

void dfs2(int u, int ind){
	seen[u] = 2;
	for (auto [i, id] : nei[u]){
		if (id == -ind)
			continue;
		if (seen[i] == 2){
			Ans[abs(id)] = 'B';
			cyc[u]++;
			cyc[i]--;
		}
		else{
			dfs2(i, id);
			Up[u] += Up[i];
			Down[u] += Down[i];
			cyc[u] += cyc[i];
		}
	}

	if (cyc[u] or Up[u] + Down[u] == 0)
		Ans[abs(ind)] = 'B';
	else if ((Up[u] > 0) == (ind < 0))
		Ans[abs(ind)] = 'R';
	else
		Ans[abs(ind)] = 'L';
}

int Lca(int u, int v){
	if (hei[u] > hei[v])
		swap(u, v);

	for (int i=16;i>=0;i--)
		if (hei[u] + (1<<i) <= hei[v])
			v = par[v][i];

	for (int i=16;i>=0;i--)
		if (par[u][i] != par[v][i])
			u = par[u][i], v = par[v][i];

	return (u == v ? u : par[u][0]);
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int n, m, q;
	cin>>n>>m;

	for (int i=1, a, b;i<=m;i++){
		cin>>a>>b;
		nei[a].push_back({b, i});
		nei[b].push_back({a, -i});
	}

	dfs(1, 0);

	cin>>q;
	for (int i=1, A, B;i<=q;i++){
		cin>>A>>B;
		int lca = Lca(A, B);

		Up[A]++, Down[B]++, Up[lca]--, Down[lca]--;
	}

	dfs2(1, 0);

	for (int i=1;i<=m;i++)
		cout<<char(Ans[i]);
	cout<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...