Submission #1308604

#TimeUsernameProblemLanguageResultExecution timeMemory
1308604BalsaOne-Way Streets (CEOI17_oneway)C++17
0 / 100
8 ms16184 KiB
#include <bits/stdc++.h> using namespace std; #define all(x) (x).begin(), (x).end() #define fi first #define se second using ll = long long; const ll MAXN = 200005; struct pair_hash { size_t operator()(const pair<ll, ll>& p) const { return ((p.fi << 32) | p.se); } }; unordered_set<pair<ll, ll>, pair_hash> bridges; unordered_multiset<pair<ll, ll>, pair_hash> edges_num; vector<ll> edges[MAXN]; ll tin[MAXN], low[MAXN]; bool vis[MAXN]; ll timer = 0; void dfsbd(ll v, ll p) { if (vis[v]) return; vis[v] = 1; tin[v] = low[v] = timer++; for (ll u : edges[v]) { if (u == p) continue; if (!vis[u]) { dfsbd(u, v); low[v] = min(low[v], low[u]); if (low[u] > tin[v] && edges_num.count({v, u}) == 1) bridges.insert({v, u}); } else { low[v] = min(low[v], tin[u]); } } } ll who[MAXN]; void dfs_coloring(ll v, ll c) { if (vis[v]) return; vis[v] = 1; who[v] = c; for (ll u : edges[v]) { if (bridges.count({v, u}) || bridges.count({u, v})) continue; dfs_coloring(u, c); } } unordered_set<ll> wedges[MAXN]; bool dfs(ll v, ll p, ll dest) { if (vis[v]) return false; vis[v] = 1; if (v == dest) return true; for (ll u : wedges[v]) { if (u == p) continue; if (dfs(u, v, dest)) { // v----->u wedges[u].erase(v); return true; } } return false; } void solve() { ll n, m; cin >> n >> m; unordered_map<pair<ll, ll>, ll, pair_hash> edge2ind; for (ll i = 0; i < m; i++) { ll v, u; cin >> v >> u; v--, u--; edges[v].push_back(u); edges[u].push_back(v); edges_num.insert({v, u}); edges_num.insert({u, v}); edge2ind[{v, u}] = i; edge2ind[{u, v}] = i; } for (ll v = 0; v < n; v++) tin[v] = low[v] = 1e18; for (ll v = 0; v < n; v++) { if (vis[v]) continue; dfsbd(v, -1); } memset(vis, 0, sizeof(vis)); ll comp_num = 0; for (ll v = 0; v < n; v++) { if (vis[v]) continue; dfs_coloring(v, comp_num); comp_num++; } unordered_map<pair<ll, ll>, tuple<ll, ll, char>, pair_hash> w2e; for (ll v = 0; v < n; v++) { for (ll u : edges[v]) { if (who[v] == who[u]) continue; wedges[who[v]].insert(who[u]); w2e[{who[v], who[u]}] = {v, u, 'R'}; w2e[{who[u], who[v]}] = {u, v, 'L'}; } } memset(vis, 0, sizeof(vis)); ll p; cin >> p; while (p--) { ll v, u; cin >> v >> u; v--, u--; if (who[v] == who[u]) continue; dfs(who[v], -1, who[u]); } string ans(m, 'B'); for (ll v = 0; v < comp_num; v++) { for (ll u : wedges[v]) { auto[a, b, dir] = w2e[{v, u}]; if (dir == 'L') swap(a, b); ans[edge2ind[{a, b}]] = dir; } } cout << ans << '\n'; } int main() { // freopen("promote.in", "r", stdin); // freopen("promote.out", "w", stdout); ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...