Submission #320680

#TimeUsernameProblemLanguageResultExecution timeMemory
320680phathnvOne-Way Streets (CEOI17_oneway)C++11
100 / 100
126 ms23780 KiB
#include <bits/stdc++.h>

using namespace std;

#define X first
#define Y second
#define mp make_pair

typedef long long ll;
typedef pair <int, int> ii;

const int N = 1e5 + 1;
const int logN = 17;

struct edge{
    int u, v;
    edge(int _u = 0, int _v = 0){
        u = _u;
        v = _v;
    }
};

struct dsu{
    int root[N], rnk[N];
    void reset(int n){
        for(int i = 1; i <= n; i++){
            root[i] = i;
            rnk[i] = 0;
        }
    }
    int getRoot(int u){
        if (u == root[u])
            return u;
        root[u] = getRoot(root[u]);
        return root[u];
    }
    bool unite(int u, int v){
        u = getRoot(u);
        v = getRoot(v);
        if (u == v)
            return 0;
        if (rnk[u] < rnk[v])
            swap(u, v);
        root[v] = u;
        rnk[u] += (rnk[u] == rnk[v]);
        return 1;
    }
} G;

int n, m, p;
edge e[N];

bool used[N];
vector <ii> adj[N];
int h[N], par[N][logN], edgeToPar[N], cnt[N], dir[N];
char ans[N];


int inComp[N], nComp;

void readInput(){
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= m; i++)
        scanf("%d %d", &e[i].u, &e[i].v);
}

void dfs(int u, int p){

    inComp[u] = nComp;

    for(int i = 1; i < logN; i++)
        par[u][i] = par[par[u][i - 1]][i - 1];
    for(ii e : adj[u]){
        int v = e.X;
        int id = e.Y;
        if (v != p){
            h[v] = h[u] + 1;
            par[v][0] = u;
            edgeToPar[v] = id;
            dfs(v, u);
        }
    }
}

int getLCA(int u, int v){
    if (h[u] > h[v])
        swap(u, v);
    for(int i = logN - 1; i >= 0; i--)
        if (h[u] <= h[v] - (1 << i))
            v = par[v][i];
    if (u == v)
        return u;
    for(int i = logN - 1; i >= 0; i--)
        if (par[u][i] != par[v][i]){
            u = par[u][i];
            v = par[v][i];
        }
    return par[u][0];
}

void slowMarkNotCutEdge(int u, int v){
    while (u != v){
        if (h[u] > h[v])
            swap(u, v);
        cnt[v]++;
        v = par[v][0];
    }
}

void slowMarkDir(int u, int v){
    while (u != v){
        if (h[u] > h[v]){
            dir[u]--;
            u = par[u][0];
        } else {
            dir[v]++;
            v = par[v][0];
        }
    }
}

void markNotCutEdge(int u, int v){
    int lca = getLCA(u, v);
    cnt[u]++;
    cnt[v]++;
    cnt[lca] -= 2;
}

void markDir(int u, int v){
    dir[u]--;
    dir[v]++;
}

void dfs2(int u, int p){
    for(ii e : adj[u]){
        int v = e.X;
        if (v != p){
            dfs2(v, u);
            cnt[u] += cnt[v];
            dir[u] += dir[v];
        }
    }
}

void prepare(){
    G.reset(n);
    for(int i = 1; i <= m; i++)
        if (G.unite(e[i].u, e[i].v)){
            used[i] = 1;
            adj[e[i].u].push_back(mp(e[i].v, i));
            adj[e[i].v].push_back(mp(e[i].u, i));
        }
    for(int i = 1; i <= n; i++)
        if (!par[i][0]){
            ++nComp;
            dfs(i, -1);
        }
    for(int i = 1; i <= m; i++)
        if (!used[i])
            markNotCutEdge(e[i].u, e[i].v);
}

void solve(){
    scanf("%d", &p);
    for(int i = 1; i <= p; i++){
        int u, v;
        scanf("%d %d", &u, &v);
        markDir(u, v);
    }
    memset(ans, 'B', sizeof(ans));

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

    for(int i = 1; i <= n; i++)
        if (par[i][0]){
            if (cnt[i] > 0 || dir[i] == 0)
                continue;
            int id = edgeToPar[i];
            if (dir[i] < 0)
                ans[id] = (e[id].u == i? 'R' : 'L');
            else
                ans[id] = (e[id].u == i? 'L' : 'R');
        }

    for(int i = 1; i <= m; i++)
        putchar(ans[i]);
}

int main(){
    readInput();
    prepare();
    solve();
    return 0;
}

Compilation message (stderr)

oneway.cpp: In function 'void readInput()':
oneway.cpp:62:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   62 |     scanf("%d %d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~~
oneway.cpp:64:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   64 |         scanf("%d %d", &e[i].u, &e[i].v);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
oneway.cpp: In function 'void solve()':
oneway.cpp:164:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  164 |     scanf("%d", &p);
      |     ~~~~~^~~~~~~~~~
oneway.cpp:167:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  167 |         scanf("%d %d", &u, &v);
      |         ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...