Submission #546750

# Submission time Handle Problem Language Result Execution time Memory
546750 2022-04-08T11:56:56 Z Mazaalai One-Way Streets (CEOI17_oneway) C++17
0 / 100
2 ms 3028 KB
#include <bits/stdc++.h>
#define ALL(x) x.begin(),x.end()
#define pb push_back
#define mp make_pair
using namespace std;
using PII = pair <int, int>;

struct Edge {
	int a, b, id;
	bool operator < (const Edge& x) const {
		return mp(a, b) < mp(x.a, x.b);
	}
};
const int N = 1e5+5;
vector <PII> paths[N];
vector <Edge> edges;
int n, m, k, q, curT;
int vis[N], dp[N];
int par[N];
int find(int a) {
	if (par[a] == a) return a;
	return par[a] = find(par[a]);
}
void merge(int a, int b) {
	a = find(a);
	b = find(b);
	if (a == b) return;
	par[b] = a;
}
stack <int> stk;
int dfs(int pos, int p = -1) {
	vis[pos] = ++curT;
	// cout << pos << '\n';
	int got = 0;
	for (auto& [a, b] : paths[pos]) {
		if (b == p || vis[a] > vis[pos]) continue;
		if (vis[a] > 0 && vis[a] < vis[pos]) {
			dp[pos]++;
			dp[a]--;
			continue;
		}
		got += dfs(a, b);
	}
	// cout << "VAL: " << pos << ' ' << dp[pos]+got << '\n';
	if (dp[pos]+got > 0) stk.push(pos);
	if (!stk.empty() && got > 0 && got+dp[pos]==0) {
		int cur = pos;
		while(!stk.empty()) {
			int x = stk.top(); stk.pop();
			merge(cur, x);
		}
	}
	dp[pos] += got;
	return dp[pos];
}
string answ = "XLRB";
int ans[N]; // 1 L, 2 R, 3 B
map <PII, int> ids;
bool vis1[N];
int dfs1(int pos, int par = 0) {
	if (vis1[pos]) return 0;
	vis1[pos] = 1;
	// cout << pos << ' ' << par << '\n';
	for (auto& [a, b] : paths[pos]) {
		if (a == par) continue;
		if (find(a) == find(pos)) dfs1(a, pos);
		else dp[pos] += dfs1(a, pos);
	}
	if (par > 0) {
		// cout << pos << ' ' << par << '\n';
		// cout << pos << ',' << par << ' ' << dp[pos] << '\n';
		if (dp[pos] > 0) {
			if (ids.count({pos, par})) ans[ids[{pos, par}]] |= 2;
			else ans[ids[{par, pos}]] |= 1;
			// cout << ans[ids[{pos, par}]] << '\n';
		} else if (dp[pos] == 0) {
			if (ids.count({pos, par})) ans[ids[{pos, par}]] |= 3;
			else ans[ids[{par, pos}]] |= 3;
		} else {
			if (ids.count({pos, par})) ans[ids[{pos, par}]] |= 1;
			else ans[ids[{par, pos}]] |= 2;
		}
	}
	return dp[pos];
}
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	// freopen("0.in", "r", stdin);
	// freopen("0.out", "w", stdout);
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		int a, b; cin >> a >> b;
		if (a == b) {
			ans[i] |= 3;
		} else {
			edges.pb({a, b, i});
			paths[a].pb({b, i});
			paths[b].pb({a, i});
		}
		ids[{a, b}] = i;
		// ids[{b, a}] = i;
	}
	// find and merge cycles
	{
		iota(par+1, par+1+n, 1);
		dfs(1);
		
		// for (int i = 1; i <= n; i++) {
		// 	cout << i << ": " << find(i) << '\n';
		// }
	}
	memset(dp, 0, sizeof(dp));
	cin >> q;
	for (int i = 1; i <= q; i++) {
		int a, b; cin >> a >> b;
		dp[a]++; dp[b]--;
		// cout << "HELLO: " << a << ' ' << b << '\n';
	}
	for (int i = 1; i <= n; i++) {
		int x = find(i);
		if (x == i) continue;
		for (auto el : paths[i]) paths[x].pb(el);
	}
	
	dfs1(find(1));
	for (auto edge : edges) {
		if (find(edge.a) == find(edge.b)) ans[edge.id] |= 3;
	}
	for (int i = 1; i <= m; i++) cout << answ[ans[i]];
		cout << '\n';
}









# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 3028 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 3028 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 3028 KB Output isn't correct
2 Halted 0 ms 0 KB -