Submission #1264933

#TimeUsernameProblemLanguageResultExecution timeMemory
1264933minggaOne-Way Streets (CEOI17_oneway)C++20
100 / 100
62 ms20672 KiB
// Author: caption_mingle
#include "bits/stdc++.h"

using namespace std;

#define ln "\n"
#define pb push_back
#define fi first
#define se second
#define all(x) (x).begin(), (x).end()
#define sz(x) ((int)(x).size())
#define ll long long
const int mod = 1e9 + 7;
const int inf = 2e9;
const int N = 1e5 + 7;
int n, m, q, scc;
int num[N], low[N], timer, del[N], id[N];
bool vis[N];
char ans[N];
vector<int> st;
int f[N];
pair<int, int> edge[N];

vector<pair<int, int>> g[N], g2[N];

void dfs(int u, int eid) {
	low[u] = num[u] = ++timer;
	st.pb(u);
	for(auto [v, id] : g[u]) {
		if(id == eid or del[v]) continue;
		if(num[v]) {
			low[u] = min(low[u], num[v]);
		} else {
			dfs(v, id);
			low[u] = min(low[u], low[v]);
		}
	}
	if(num[u] == low[u]) {
		int v;
		scc++;
		do {
			v = st.back();
			del[v] = 1;
			id[v] = scc;
			st.pop_back();
		} while(v != u);
	}
}

void dfs2(int u, int p) {
	vis[u] = 1;
	for(auto [v, eid] : g2[u]) {
		if(v == p) continue;
		dfs2(v, u);
		f[u] += f[v];
		auto [a, b] = edge[eid];
		// cerr << a << ' ' << b << ' ' << u << ' ' << v << ln;
		if(f[v] < 0) {
			// v - > u;
			if(id[a] == v) ans[eid] = 'L';
			else ans[eid] = 'R';
		} else if(f[v] > 0) {
			//u -> v;
			if(id[a] == v) ans[eid] = 'R';
			else ans[eid] = 'L';
		}
	}
}

signed main() {
	cin.tie(0) -> sync_with_stdio(0);
	#define task ""
	if(fopen(task ".INP", "r")) {
		freopen(task ".INP", "r", stdin);
		freopen(task ".OUT", "w", stdout);
	}
	cin >> n >> m;
	for(int i = 1; i <= m; i++) {
		int u, v; cin >> u >> v;
		ans[i] = 'B';
		if(u != v) {
			g[u].pb({v, i});
			g[v].pb({u, i});
			edge[i] = {u, v};
		}
	}
	for(int i = 1; i <= n; i++) {
		if(num[i]) continue;
		dfs(i, 0);
	}
	for(int u = 1; u <= n; u++) {
		for(auto [v, eid] : g[u]) {
			if(id[v] != id[u]) {
				int U = id[u], V = id[v];
				g2[U].pb({V, eid});
			}
		}
	}
	cin >> q;
	for(int i = 1; i <= q; i++) {
		int u, v; cin >> u >> v;
		int U = id[u], V = id[v];
		f[U]++;
		f[V]--;
	}
	for(int u = 1; u <= n; u++) {
		if(vis[u]) continue;
		dfs2(u, 0);
	}
	for(int i = 1; i <= m; i++) cout << ans[i];
    cerr << "\nTime: " << clock() * 1000 / CLOCKS_PER_SEC;
}

Compilation message (stderr)

oneway.cpp: In function 'int main()':
oneway.cpp:74:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   74 |                 freopen(task ".INP", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
oneway.cpp:75:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   75 |                 freopen(task ".OUT", "w", stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...