제출 #1277965

#제출 시각아이디문제언어결과실행 시간메모리
1277965g4yuhgOne-Way Streets (CEOI17_oneway)C++20
100 / 100
472 ms58540 KiB
//Huyduocdithitp
#include<bits/stdc++.h>
typedef int ll;
#define endl '\n'
#define fi first
#define se second
#define pii pair<int, int>
#define N 100005
#define LOG 18
using namespace std;

bool ghuy4g;

struct Canh {
	ll u, v, id;
} canh[N];

pii kq[N];

vector<pii> adj[N], adj2[N];

ll n, m, q, high[N];
ll num[N], low[N], timeDfs, par[N], Par[N][LOG + 2];

bool vst[N];

void dfs2(ll u, ll parent) {
	vst[u] = 1;
	//cout << u << " high " << high[u] << endl;
	for (auto v : adj2[u]) {
		if (v.fi == parent) continue;
		Par[v.fi][0] = u;
		high[v.fi] = high[u] + 1;
		dfs2(v.fi, u);
	}
}

ll find(ll u) {
	if (par[u] < 0) return u;
	return par[u] = find(par[u]);
}

void join(ll u, ll v) {
	u = find(u);
	v = find(v);
	if (u == v) return;
	if (par[u] <= par[v]) {
		par[u] += par[v];
		par[v] = u;
	}
	else {
		par[v] += par[u];
		par[u] = v;
	}
}

ll mp[N], bcc, fl[N], fx[N], pl[N], px[N];
vector<ll> p[N];
vector<pii> lap;

void dfs(ll u, ll parent) {
	low[u] = num[u] = ++ timeDfs;
	for (auto vv : adj[u]) {
		ll v = vv.fi;
		if (v == parent) continue;
		if (num[v]) {
			join(u, v);
			low[u] = min(low[u], num[v]);
		}
		else {
			dfs(v, u);
			low[u] = min(low[u], low[v]);
			if (low[v] == num[v]) {
				
			}
			else {
				join(u, v);
			}
		}
	}
}

ll lca(ll u, ll v) {
	if (high[u] > high[v]) swap(u, v);
	for (int j = LOG; j >= 0; j --) {
		if (high[v] - high[u] >= (1 << j)) {
			v = Par[v][j];
		}
	}
	if (u == v) return u;
	for (int j = LOG; j >= 0; j --) {
		if (Par[u][j] != Par[v][j]) {
			u = Par[u][j];
			v = Par[v][j];
		}
	}
	return Par[u][0];
}

ll kth_par(ll u, ll k) {
	for (int j = LOG; j >= 0; j --) {
		if (k >= (1 << j)) {
			k -= (1 << j);
			u = Par[u][j];
		}
	}
	return u;
}

void dfs3(ll u, ll parent) {
	vst[u] = 1;
	for (auto v : adj2[u]) {
		if (v.fi == parent) continue;
		dfs3(v.fi, u);
		fx[u] += fx[v.fi];
		fl[u] += fl[v.fi];
	}
}

void pre() {
	for (int i = 1; i <= n; i ++) {
		if (num[i] == 0) {
			dfs(i, i);
		}
	}
	for (auto it : lap) {
		join(it.fi, it.se);
	}
	
	map<ll, ll> mp1;
	
	for (int i = 1; i <= n; i ++) {
		ll r = find(i);
		if (mp1[r] == 0) {
			mp1[r] = ++ bcc;
		}
		mp[i] = mp1[r];
		p[mp[i]].push_back(i);
		//cout << i << " " << mp[i] << endl;
	}
	map<pii, pii> mp4;
	//cout << "bcc " << bcc << endl;
	for (int i = 1; i <= bcc; i ++) {
		for (auto u : p[i]) {
			//cout << "u " << u << endl;
			for (auto v : adj[u]) {
				//cout << "v " << v.fi << " " << v.se << endl;
				//cout << u << " " << v.fi << " " << mp[u] << " " << mp[v.fi] << endl;
				if (mp[v.fi] == mp[u]) continue;
				//cout << u << " " << v.fi << " " << mp[u] << " " << mp[v.fi] << endl;
				adj2[mp[u]].push_back({mp[v.fi], v.se});
				//cout << mp[u] << " " << mp[v.fi] << endl;
				mp4[{mp[u], mp[v.fi]}] = {u, v.fi};
				//adj2[mp[v.fi]].push_back({mp[u], v.se});
			}
		}
		//cout << endl;
	}	
	for (int i = 1; i <= bcc; i ++) {
		if (vst[i] == 0) dfs2(i, i);
	}
	for (int j = 1; j <= LOG; j ++) {
		for (int i = 1; i <= bcc; i ++) {
			ll P = Par[i][j - 1];
			Par[i][j] = Par[P][j - 1];
		}
	}
	for (int i = 1; i <= q; i ++) {
		ll u, v;
		cin >> u >> v;
		if (mp[u] == mp[v]) continue;
		u = mp[u];
		v = mp[v];
		ll x = lca(u, v);
		fl[u] ++ ;
		fl[x] -- ;
		fx[v] ++ ;
		fx[x] -- ;
	}
	for (int i = 1; i <= bcc; i ++) vst[i] = 0;
	for (int i = 1; i <= bcc; i ++) {
		if (vst[i] == 0) dfs3(i, i);
	}
	bool flag = 1;
	for (int i = 1; i <= bcc; i ++) {
		if (fx[i] > 0 && fl[i] > 0) {
			flag = 0;
			cout << -1;
			exit(0);
		}
		if (fx[i] > 0) {
			for (auto v : adj2[i]) {
				if (v.fi == Par[i][0]) {
					kq[v.se] = {mp4[{v.fi, i}].se, mp4[{v.fi, i}].fi};
				}
			}
		}
		else if (fl[i] > 0) {
			for (auto v : adj2[i]) {
				if (v.fi == Par[i][0]) {
					kq[v.se] = {mp4[{v.fi, i}].fi, mp4[{v.fi, i}].se};
				}
			}
		}
	}
	for (int i = 1; i <= m; i ++) {
		if (kq[i].fi == 0 && kq[i].se == 0) {
			cout << "B";
			continue;
		}
		if (kq[i].fi == canh[i].u) {
			cout << "L";
		}
		else {
			cout << "R";
		}
	}
}

bool klinh;

signed main() {
	memset(par, -1, sizeof(par));
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	
	map<pii, ll> mp3;
	
	cin >> n >> m;
	for (int i = 1; i <= m; i ++) {
		cin >> canh[i].u >> canh[i].v;
		canh[i].id = i;
		//if (canh[i].u > canh[i].v) swap(canh[i].u, canh[i].v);
		mp3[{min(canh[i].u, canh[i].v), max(canh[i].u, canh[i].v)}] ++ ;
		if (mp3[{min(canh[i].u, canh[i].v), max(canh[i].u, canh[i].v)}] == 2) {
			lap.push_back({canh[i].u, canh[i].v});
		}
		//cout << canh[i].u << " -> " << canh[i].v << endl;
		adj[canh[i].u].push_back({canh[i].v, i});
		adj[canh[i].v].push_back({canh[i].u, i});
	}
	cin >> q;
	pre();
	
	cerr << fabs(&klinh - &ghuy4g) / double(1024 * 1024);
	
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...