제출 #1197125

#제출 시각아이디문제언어결과실행 시간메모리
1197125aykhnOne-Way Streets (CEOI17_oneway)C++20
0 / 100
3094 ms4928 KiB
#include <bits/stdc++.h>

using namespace std;

#define inf 0x3F3F3F3F

const int MXN = 1e5 + 5;

struct DSU
{
  vector<int> e;
  vector<array<int, 2>> up;
  void init(int n)
  {
    e.assign(n + 1, -1);
    up.assign(n + 1, {0, 0});
  }
  int get(int x)
  {
    if (e[x] < 0) return x;
    return e[x] = get(e[x]);
  }
  int getup(int x)
  {
    return up[get(x)][1];
  }
  void unite(int x, int y)
  {
    x = get(x), y = get(y);
    if (x == y) return;
    if (e[x] > e[y]) swap(x, y);
    e[x] += e[y];
    up[x] = min(up[x], up[y]);
    e[y] = x;
  }
};

int n;
vector<array<int, 2>> adj[MXN], g[MXN];
vector<array<int, 2>> ed;
int used[MXN], dep[MXN], bri[MXN], par[MXN];
DSU dsu, dsu1;

int findbr(int a, int prv)
{
  int mn = inf;
  used[a] = 1;
  for (auto &[v, i] : adj[a])
  {
    if (i == prv) continue;
    if (used[v]) 
    {
      mn = min(mn, dep[v]);
      continue;
    }
    dep[v] = dep[a] + 1;
    mn = min(mn, findbr(v, i));
  }
  if (mn >= dep[a] && prv != -1) bri[prv] = 1; 
  return mn;
}
void dfs(int a, int p)
{
  for (auto &[v, i] : g[a])
  {
    if (v == p) continue;
    par[v] = i;
    dep[v] = dep[a] + 1;
    dfs(v, a);
  }
}

void _()
{
  int m;
  cin >> n >> m;
  dsu.init(n), dsu1.init(n);
  for (int i = 0; i < m; i++)
  {
    int u, v;
    cin >> u >> v;
    adj[u].push_back({v, i});
    adj[v].push_back({u, i});
    ed.push_back({u, v});
  }
  for (int i = 1; i <= n; i++) 
  {
    if (!used[i]) findbr(i, -1);
  }
  for (int i = 0; i < m; i++)
  {
    if (!bri[i]) dsu.unite(ed[i][0], ed[i][1]);
  }
  for (int i = 0; i < m; i++)
  {
    if (bri[i]) 
    {
      g[dsu.get(ed[i][0])].push_back({dsu.get(ed[i][1]), i});
      g[dsu.get(ed[i][1])].push_back({dsu.get(ed[i][0]), i});
    }
  }
  fill(dep, dep + n + 1, -1);
  for (int i = 1; i <= n; i++)
  {
    if (dsu.get(i) != i) continue;
    if (dep[i] != -1) continue;
    dfs(i, i);
  }
  for (int i = 1; i <= n; i++) dsu1.up[i] = {dep[i], i};
  string res(m, 'B');
  int q;
  cin >> q;
  while (q--)
  {
    int u, v;
    cin >> u >> v;
    u = dsu.get(u), v = dsu.get(v);
    while (u != v)
    {
      if (dep[u] > dep[v])
      {
        res[par[u]] = 0;
        if (dsu.get(ed[par[u]][0]) == u)
        u = dsu.get(ed[par[u]][0]) ^ dsu.get(ed[par[u]][1]) ^ u;
      }
      else 
      {
        res[par[v]] = 1;
        v = dsu.get(ed[par[v]][0]) ^ dsu.get(ed[par[v]][1]) ^ v;
      }
    }
    // while (dsu1.getup(u) != dsu1.getup(v))
    // {
    //   int A = dsu1.getup(u), B = dsu1.getup(v); 
    //   if (dep[A] > dep[B]) 
    //   {
    //     res[par[A]] = 0;
    //     int X = dsu.get(ed[par[A]][0]), Y = dsu.get(ed[par[A]][1]);
    //     assert(X == A || Y == A);
    //     dsu1.unite(A, X ^ Y ^ A);
    //   }
    //   else 
    //   {
    //     res[par[B]] = 1;
    //     int X = dsu.get(ed[par[B]][0]), Y = dsu.get(ed[par[B]][1]);
    //     assert(X == B || Y == B);
    //     dsu1.unite(B, dsu.get(ed[par[B]][0]) ^ dsu.get(ed[par[B]][1]) ^ B);
    //   }
    // }
  }
  for (int i = 0; i < m; i++)
  {
    if (res[i] == 'B') continue;
    int u = dsu.get(ed[i][0]), v = dsu.get(ed[i][1]);
    assert(par[u] == i || par[v] == i);
    if (res[i] == 0)
    {
      if (par[u] == i) res[i] = 'R';
      else res[i] = 'L';
    }
    else
    {
      if (par[u] == i) res[i] = 'L';
      else res[i] = 'R';
    }
  }
  cout << res << '\n';
}

signed main()
{
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int t = 1;
  // cin >> t;
  while (t--) _();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...