제출 #1160731

#제출 시각아이디문제언어결과실행 시간메모리
1160731Nguyen22cppOne-Way Streets (CEOI17_oneway)C++20
0 / 100
3 ms5184 KiB
#include <bits/stdc++.h>
using namespace std;

#define TASK "test"
#define int long long
#define ii pair <int, int>
#define fi first
#define sc second

#define rep(i,s,e) for (int i = (s), _e = (e); i <= _e; i++)
#define reo(i,s,e) for (int i = (s), _e = (e); i >= _e; i--)

const int maxn = (int)1e5 + 5;
const int inf = (int)1e9;
const int mod = (int)1e9 + 7;

int n, m, p;
vector <int> adj[maxn];
ii edge[maxn];
unordered_map <int, int> lab;
bool check[maxn];

int timer, low[maxn], num[maxn];

void tarjan (int u = 1, int p = 0)
{
    low[u] = num[u] = ++timer;
    for (auto v : adj[u])
    {
        if (v == p) continue;
        if (num[v]) low[u] = min(low[u], num[v]);
        else
        {
            tarjan(v, u);
            low[u] = min(low[u], low[v]);
            if (low[v] == num[v]) check[lab[u * n + v]] = true;
        }
    }
}

int par[maxn], sz[maxn];

int find (int u)
{
    return par[u] == u ? u : par[u] = find(par[u]);
}

void uniset (int u, int v)
{
    u = find(u), v = find(v);
    if (u == v) return ;

    if (sz[u] < sz[v]) swap(u, v);
    par[v] = u, sz[u] += sz[v];
}

struct DATA
{
    int u, e, is;
} up[maxn];
vector <DATA> new_adj[maxn];
int depth[maxn], ans[maxn];

void dfs (int u = 1, int p = 0)
{
    for (auto [v, e, is] : new_adj[u])
    {
        if (v == p) continue;
        depth[v] = depth[u] + 1;
        up[v] = {u, e, is ^ 1};
        dfs(v, u);
    }
}

signed main ()
{
    cin.tie(0)->sync_with_stdio(false);

    freopen(TASK".inp","r",stdin);
    freopen(TASK".out","w",stdout);

    cin >> n >> m;
    rep (i, 1, m)
    {
        int u, v; cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
        edge[i] = {u, v};
        lab[u * n + v] = lab[v * n + u] = i;
    }

    tarjan();

    rep (u, 1, n)
    {
        par[u] = u;
        sz[u] = 1;
    }

    rep (i, 1, m) if (!check[i])
    {
        int u, v; tie(u, v) = edge[i];
        uniset(u, v);
    }

    rep (i, 1, m) if (check[i])
    {
        int u, v; tie(u, v) = edge[i];
        u = find(u), v = find(v);
        new_adj[u].push_back({v, i, 1});
        new_adj[v].push_back({u, i, 0});
    }

    dfs();

    rep (i, 1, m) ans[i] = -1;

    cin >> p;
    while (p--)
    {
        int u, v; cin >> u >> v;
        u = find(u), v = find(v);
        if (u == v) continue;

        while (depth[u] > depth[v])
        {
            ans[up[u].e] = up[u].is;
            u = up[u].u;
        }

        while (depth[u] < depth[v])
        {
            ans[up[v].e] = up[v].is ^ 1;
            v = up[v].u;
        }

        while (u != v)
        {
            ans[up[u].e] = up[u].is;
            u = up[u].u;
            ans[up[v].e] = up[v].is ^ 1;
            v = up[v].u;
        }
    }

    rep (i, 1, m)
    {
        if (ans[i] == -1) cout << 'B';
        else cout << (ans[i] == 1 ? 'R' : 'L');
    }

    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

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