Submission #199361

#TimeUsernameProblemLanguageResultExecution timeMemory
199361nvmdavaOne-Way Streets (CEOI17_oneway)C++17
100 / 100
487 ms57336 KiB
#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define ll long long
#define ff first
#define ss second
#define N 100005
#define MOD 1000000007

vector<int> adj[N];
int v[N], u[N];
int dsu[N];
int dep[N], low[N];
int ans[N];

int find(int x){
    return x == dsu[x] ? x : dsu[x] = find(dsu[x]);
}
void merge(int a, int b){
    dsu[find(a)] = find(b);
}

int proc[N];

void dfs(int v, int p){
    ++proc[v];
    low[v] = dep[v] = dep[::v[p] ^ ::u[p] ^ v] + 1;
    
    for(auto& x : adj[v]){
        if(x == p) continue;
        int u = ::v[x] ^ ::u[x] ^ v;
        if(!dep[u])
            dfs(u, x);
        low[v] = min(low[v], low[u]);
    }
    if(low[v] != dep[v])
        merge(v, ::v[p] ^ ::u[p] ^ v);
}

map<int, int> in[N];

void dfs2(int v, int p){
    ++proc[v];
    for(auto& x : adj[v]){
        if(x == p) continue;
        int u = ::v[x] ^ ::u[x] ^ v;
        dfs2(u, x);
        if(in[v].size() < in[u].size())
            swap(in[v], in[u]);
    }

    for(auto& x : adj[v]){
        if(x == p) continue;
        int u = ::v[x] ^ ::u[x] ^ v;
        for(auto& y : in[u]){
            if((in[v][y.ff] += y.ss) == 3)
                in[v].erase(y.ff);
        }
    }
    if(!in[v].empty()){
        int val = in[v].begin() -> ss - 1;
        if(val ^ (v == ::v[p]) == 1)
            ans[p] = 1;
        else
            ans[p] = 2;
    }
}

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

    int n, m;
    cin>>n>>m;
    for(int i = 1; i <= m; ++i){
        cin>>v[i]>>u[i];
        adj[v[i]].push_back(i);
        adj[u[i]].push_back(i);
    }

    for(int i = 1; i <= n; ++i)
        dsu[i] = i;
    
    for(int i = 1; i <= n; ++i)
        if(proc[i] == 0)
            dfs(i, 0);

    for(int i = 1; i <= n; ++i)
        adj[i].clear();
    for(int i = 1; i <= m; ++i){
        v[i] = find(v[i]);
        u[i] = find(u[i]);
        if(v[i] != u[i]){
            adj[v[i]].push_back(i);
            adj[u[i]].push_back(i);
        }
    }

    int p;
    cin>>p;

    while(p--){
        int a, b;
        cin>>a>>b;
        a = find(a);
        b = find(b);
        if(a != b){
            in[a][p] = 1;
            in[b][p] = 2;
        }
    }

    for(int i = 1; i <= n; ++i)
        if(proc[find(i)] == 1)
            dfs2(find(i), 0);

    for(int i = 1; i <= m; ++i)
        if(ans[i] == 0)
            cout<<"B";
        else if(ans[i] == 2)
            cout<<"L";
        else
            cout<<"R";
}

Compilation message (stderr)

oneway.cpp: In function 'void dfs2(int, int)':
oneway.cpp:62:32: warning: suggest parentheses around comparison in operand of '^' [-Wparentheses]
         if(val ^ (v == ::v[p]) == 1)
                  ~~~~~~~~~~~~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...