Submission #442699

#TimeUsernameProblemLanguageResultExecution timeMemory
442699BeanZOne-Way Streets (CEOI17_oneway)C++14
100 / 100
516 ms83436 KiB
// I_Love_LPL 11m
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const int N = 3e5 + 5;
long long mod = 1000007;
const int lim = 4e5 + 5;
const int lg = 20;
const int base = 311;
const long double eps = 1e-6;
ll ans = 0, timer = 0, cnt = 0;
vector<pair<ll, ll>> node[N];
vector<ll> adj[N];
ll ids[N], low[N], in[N], vis[N], s[N], e[N], sz[N], dep[N], dp[N][lg + 1], grp[N];
char res[N];
ll root;
vector<ll> st;
map<pair<ll, ll>, ll> dir, mem;
void dfs3(ll u, ll p){
    vis[u] = 1;
    for (auto j : adj[u]){
        if (j == p) continue;
        dfs3(j, u);
        sz[u] += sz[j];
    }
    if (sz[u] < 0){
        if (dir[{p, u}]) res[mem[{p, u}]] = 'R';
        else res[mem[{p, u}]] = 'L';
    } else if (sz[u] > 0) {
        if (dir[{p, u}]) res[mem[{p, u}]] = 'L';
        else res[mem[{p, u}]] = 'R';
    }
}
ll LCA(ll u, ll v){
    if (dep[u] > dep[v]) swap(u, v);
    ll dist = dep[v] - dep[u];
    for (int i = 0; i <= lg; i++){
        if (dist & (1 << i)){
            v = dp[v][i];
        }
    }
    if (u == v) return u;
    for (int i = lg; i >= 0; i--){
        if (dp[v][i] != dp[u][i]){
            v = dp[v][i];
            u = dp[u][i];
        }
    }
    return dp[v][0];
}
void dfs2(ll u, ll p){
    vis[u] = 1;
    for (int i = 1; i <= lg; i++) dp[u][i] = dp[dp[u][i - 1]][i - 1];
    for (auto j : adj[u]){
        if (j == p) continue;
        dep[j] = dep[u] + 1;
        dp[j][0] = u;
        dfs2(j, u);
    }
}
void dfs(ll u, ll p){
    vis[u] = 1;
    timer++;
    ids[u] = low[u] = timer;
    st.push_back(u);
    in[u] = 1;
    for (auto j : node[u]){
        if (j.second == p) continue;
        if (in[j.first]){
            low[u] = min(low[u], ids[j.first]);
        } else if (vis[j.first] == 0){
            dfs(j.first, j.second);
            low[u] = min(low[u], low[j.first]);
        }
    }
    if (low[u] == ids[u]){
        ans++;
        while (true){
            ll x = st.back();
            grp[x] = ans;
            in[x] = 0;
            st.pop_back();
            low[x] = low[u];
            if (x == u) break;
        }
    }
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    if (fopen("tests.inp", "r")){
        freopen("test.inp", "r", stdin);
        freopen("test.out", "w", stdout);
    }
    ll n, m, p;
    cin >> n >> m;
    for (int i = 1; i <= m; i++){
        cin >> s[i] >> e[i];
        node[s[i]].push_back({e[i], i});
        node[e[i]].push_back({s[i], i});
        res[i] = '?';
    }
    for (int i = 1; i <= n; i++){
        if (vis[i]) continue;
        root = i;
        dfs(i, 0);
    }
    memset(vis, 0, sizeof(vis));
    for (int i = 1; i <= m; i++){
        ll u = grp[s[i]], v = grp[e[i]];
        if (u == v) continue;
        if (mem[{u, v}] == 0){
            adj[u].push_back(v);
            adj[v].push_back(u);
            mem[{u, v}] = i;
            mem[{v, u}] = i;
            dir[{u, v}] = 1;
            dir[{v, u}] = 0;
        }
    }
    for (int i = 1; i <= ans; i++){
        if (vis[i]) continue;
        dfs2(i, i);
    }
    cin >> p;
    for (int i = 1; i <= p; i++){
        ll u, v;
        cin >> u >> v;
        u = grp[u];
        v = grp[v];
        ll lca = LCA(grp[u], grp[v]);
        sz[u] += 1;
        sz[lca] -= 1;
        sz[v] -= 1;
        sz[lca] += 1;
    }
    memset(vis, 0, sizeof(vis));
    for (int i = 1; i <= ans; i++){
        if (vis[i]) continue;
        dfs3(i, i);
    }
    for (int i = 1; i <= m; i++){
        if (res[i] == '?') res[i] = 'B';
        cout << res[i];
    }
}
/*
Ans:

Out:
*/

Compilation message (stderr)

oneway.cpp: In function 'int main()':
oneway.cpp:93:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   93 |         freopen("test.inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
oneway.cpp:94:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   94 |         freopen("test.out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...