Submission #1259709

#TimeUsernameProblemLanguageResultExecution timeMemory
1259709sitingfakeOne-Way Streets (CEOI17_oneway)C++20
100 / 100
61 ms20036 KiB
#include <bits/stdc++.h>

#define name "way"
#define FOR(i, a, b) for (int i = a; i <= b; ++i)
#define FORD(i, a, b) for (int i = a; i >= b; --i)
#define ll long long
#define fi first
#define se second
#define ii pair <int, int>
#define sz(a) (int) a.size()
#define pb push_back
#define MASK(x) (1ll << x)
#define bit(x, i) ((x >> i) & 1)
#define pop_count(x) __builtin_popcount(x)
#define mingdu signed main()

using namespace std;

const ll mod = 1e9 + 7;

void add(ll& a, ll b) {
    a += b;
    if (a >= mod) a -= mod;
    if (a < 0) a += mod;
}

template<class X, class Y> void mx(X &x, const Y y) {if (y > x) x = y;}
template<class X, class Y> void mn(X &x, const Y y) {if (y < x) x = y;}

const int N = 1e5 + 5;
int a[N], n, m, tin[N], low[N], timer;
int scc[N], cnt;
char ans[N];
ll diff[N];
bool d[N], vis[N];
vector <ii> adj[N], g[N];
ii edge[N];

void nhap() {
    cin >> n >> m;
    FOR(i, 1, m) {
        int u, v; cin >> u >> v;
        adj[u].pb({v, i});
        adj[v].pb({u, i});
        edge[i] = {u, v};
    }
}

void dfs(int u, int p) {
    tin[u] = low[u] = ++timer;
    FOR(i, 0, sz(adj[u]) - 1) {
        int v = adj[u][i].fi;
        int id = adj[u][i].se;
        if (id == p) continue;

        if (!tin[v]) {
            dfs(v, id);
            low[u] = min(low[u], low[v]);
            if (low[v] > tin[u]) d[id] = 1;
        }

        else low[u] = min(low[u], tin[v]);
    }
}

void dfs_scc(int u) {
    scc[u] = cnt;
    FOR(i, 0, sz(adj[u]) - 1) {
        int v = adj[u][i].fi;
        int id = adj[u][i].se;
        if (!d[id] && !scc[v]) dfs_scc(v);
    }
}

ll DFS(int u, int p) {
    ll s = diff[u];
    vis[u] = 1;
    FOR(i, 0, sz(g[u]) - 1) {
        int v = g[u][i].fi,
            id = g[u][i].se;

        if (v == p) continue;
        ll t = DFS(v, u);
        int x = edge[id].fi, y = edge[id].se;
        x = scc[x], y = scc[y];

        if (t > 0) ans[id] = (x == v && y == u) ? 'R' : 'L';
        else if (t < 0) ans[id] = (x == u && y == v) ? 'R' : 'L';

        s += t;
    }

    return s;
}

void giai() {
    FOR(i, 1, n) if (!tin[i]) dfs(i, -1);
    FOR(i, 1, n) if (!scc[i]) ++cnt, dfs_scc(i);

    FOR(i, 1, m) if (d[i]) {
        int u = edge[i].fi, v = edge[i].se;
        int x = scc[u], y = scc[v];
        g[x].pb({y, i});
        g[y].pb({x, i});
    }

    int q; cin >> q;
    while (q--) {
        int x, y; cin >> x >> y;
        int u = scc[x], v = scc[y];
        if (u == v) continue;
        diff[u]++;
        diff[v]--;
    }

    FOR(i, 1, m) ans[i] = 'B';
    FOR(i, 1, cnt) if (!vis[i]) DFS(i, 0);
    FOR(i, 1, m) cout << ans[i];
}

mingdu {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    if (fopen(name".inp", "r")) {
        freopen(name".inp", "r", stdin);
        freopen(name".out", "w", stdout);
    }

    nhap();
    giai();

    return 0;
}

Compilation message (stderr)

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