제출 #1181048

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

#define int long long
#define ll long long
#define FOR(i, l, r) for (int i = (l); i <= (r); i++)
#define FOD(i, r, l) for (int i = (r); i >= (l); i--)
#define fi first
#define se second
#define pii pair<int, int>

const ll mod = 1e7 + 1203;
const ll MAXN = 1e5 + 5;
const ll oo = 1e18;
const ll base = 320;

int n, m, p, num[MAXN], low[MAXN], cnt, tp[MAXN], tplt, visited[MAXN], up[MAXN][20], h[MAXN], tp2[MAXN];
int len[MAXN], xuong[MAXN];
vector<int> adj[MAXN], adj2[MAXN], adj3[MAXN];
map<pii, int> cau, kq;
pii canh[MAXN];

void dfs(int u, int par)
{
    num[u] = low[u] = ++cnt;
    for (auto v : adj[u])
    {
        if (v == par)
            continue;
        if (!num[v])
        {
            // cout << u << ' ' << v << ''
            dfs(v, u);
            low[u] = min(low[u], low[v]);
            if (num[v] == low[v])
            {
                // cout << u << ' ' << v << ' ';
                cau[{u, v}] = 0;
                cau[{v, u}] = 0;
            }
        }
        else
        {
            low[u] = min(low[u], num[v]);
        }
    }
}

void dfs2(int u)
{
    visited[u] = 1;
    tp[u] = tplt;
    for (auto v : adj2[u])
    {
        if (!visited[v])
        {

            dfs2(v);
        }
    }
}

void dfs3(int u)
{
    visited[u]=1;
    for (auto v : adj3[u])
    {
        if (v == up[u][0])
            continue;
        if(visited[v]) continue;
        // cout << u << ' ' << v;
        h[v] = h[u] + 1;
        up[v][0] = u;
        FOR(j, 1, 19)
        {
            up[v][j] = up[up[v][j - 1]][j - 1];
        }
        dfs3(v);
    }
}

int lca(int u, int v)
{
    if (h[u] != h[v])
    {
        if (h[u] < h[v])
        {
            swap(u, v);
        }
        int k = h[u] - h[v];
        for (int j = 0; (1 << j) <= k; j++)
        {
            if ((k >> j) & 1)
            {
                u = up[u][j];
            }
        }
    }
    if (u == v)
    {
        return u;
    }
    int k = __lg(h[u]);
    FOD(j, k, 0)
    {
        if (up[u][j] != up[v][j])
        {
            u = up[u][j];
            v = up[v][j];
        }
    }
    return up[u][0];
}

int flen[MAXN], fxuong[MAXN];

void dfs4(int u, int par)
{
    visited[u] = 1;
    flen[u] = len[u];
    fxuong[u] = xuong[u];
    for (auto v : adj3[u])
    {
        if (v == par)
            continue;
        if (!visited[v])
        {
            // cout << u << ' ' << v << '\n';
            dfs4(v, u);
            if (flen[v] != 0)
            {
                if (h[flen[v]] < h[flen[u]])
                {
                    flen[u] = flen[v];
                }
                
                kq[{u, v}] = 2;
                kq[{v, u}] = 1;
            }
            if (fxuong[v] != 0)
            {
                if (h[fxuong[v]] < h[fxuong[u]])
                {
                    fxuong[u] = fxuong[v];
                }
                kq[{u, v}] = 1;
                kq[{v, u}] = 2;
            }
        }
    }
    if (flen[u] == u)
    {
        flen[u] = 0;
    }
    if (fxuong[u] == u)
    {
        fxuong[u] = 0;
    }
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    if (fopen("oneway.INP", "r"))
    {
        freopen("oneway.INP", "r", stdin);
        freopen("oneway.OUT", "w", stdout);
    }

    cin >> n >> m;
    FOR(i, 1, m)
    {
        int u, v;
        cin >> u >> v;
        canh[i] = {u, v};
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    FOR(i, 1, n){
        if(!num[i]){
            dfs(i, i);
        }
    }

    FOR(i, 1, m)
    {
        auto [u, v] = canh[i];
        if (cau.find({u, v}) == cau.end())
        {
            // cout << u << ' ' << v << '\n';
            adj2[u].push_back(v);
            adj2[v].push_back(u);
        }
        else
        {
            cau[{u, v}]++;
            cau[{v, u}]++;
            // cout << u << ' ' << v << '\n';
        }
    }

    FOR(i, 1, n)
    {
        if (!visited[i])
        {
            tplt++;
            dfs2(i);
        }
    }

    FOR(i, 1, m)
    {
        auto [u, v] = canh[i];
        if (cau.find({u, v}) != cau.end())
        {
            // cout << u << ' ' << v << '\n';
            u = tp[u];
            v = tp[v];
            adj3[u].push_back(v);
            adj3[v].push_back(u);
        }
    }
    memset(visited, 0, sizeof visited);
    FOR(i, 1, n){
        if(!visited[i])
            dfs3(i);
    }
    // cout << tplt << ' ';
    // FOR(i, 1, n)
    // {
    //     cout << tp[i] << ' ';
    // }
    // cout << '\n';

    int p;
    cin >> p;
    FOR(i, 1, n)
    {
        len[i] = xuong[i] = i;
    }
    FOR(i, 1, p)
    {
        int u, v;
        cin >> u >> v;
        u = tp[u];
        v = tp[v];
        int g = lca(u, v);
        // cout << u << ' ' << v << ' ' << g << ' ' << '\n';
        if (h[g] < h[len[u]])
        {
            len[u] = g;
        }
        if (h[g] < h[xuong[v]])
        {
            xuong[v] = g;
        }
    }

    memset(visited, 0, sizeof visited);
    FOR(i, 1, n){
        if(!visited[i])
            dfs4(i, i);
    }

    FOR(i, 1, m)
    {
        auto [u, v] = canh[i];
        if (cau.find({u, v}) == cau.end())
        {
            cout << 'B';
        }
        else
        {
            if(cau[{u, v}]>1){
                cout << 'B';
                continue;
            }
            // cout << u << ' ' << v << '\n';
            u = tp[u];
            v = tp[v];
            if (kq.find({u, v}) == kq.end())
            {
                cout << 'B';
            }
            else if (kq[{u, v}] == 2)
            {
                cout << 'L';
            }
            else if (kq[{u, v}] == 1)
            {
                cout << 'R';
            }
            // cout << 'R';
        }
    }

    // cout << cau[{4, 1}];

    return 0;
}

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

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