SP10707 WA on #1 求助
  • 板块学术版
  • 楼主YBaggio
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/7/11 16:54
  • 上次更新2023/11/3 10:30:07
查看原帖
SP10707 WA on #1 求助
507534
YBaggio楼主2023/7/11 16:54
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 800010;
int n, m, d, ans, tot, c[maxn], a[maxn], f[maxn][25], dep[maxn], res[maxn], dfn[maxn][2], _dfn[maxn], p[maxn];
bool vis[maxn];
vector <int> g[maxn];
struct E {
  int l, r, _lca, id;
} q[maxn];
bool cmp (E x, E y) { return (x.l / d == y.l / d ? x.r < y.r : x.l < y.l); }
void dfs (int x, int fa) {
  dep[x] = dep[fa] + 1;
  dfn[x][0] = ++tot;
  _dfn[tot] = x;
  f[x][0] = fa;
  for (int i = 1; i < 21; i++) {
    f[x][i] = f[f[x][i - 1]][i - 1];
  }
  for (int y : g[x]) {
    if (y != fa) dfs (y, x);
  }
  dfn[x][1] = ++tot;
  _dfn[tot] = x;
} 
void init () {
  pair <int, int> b[maxn];
  for (int i = 1; i <= n; i++) {
    b[i].first = c[i];
    b[i].second = i;
  }
  sort (b + 1, b + n + 1);
  for (int i = 1, tmp = 0; i <= n; i++){
    tmp += b[i].first != b[i - 1].first;
    c[b[i].second] = tmp;
  }
}
int Lca (int x, int y) {
  if (dep[x] < dep[y]) swap (x, y);
  for (int i = 20; i >= 0; i--) {
    if (dep[f[x][i]] >= dep[y]) x = f[x][i]; 
  }
  if (x == y) return x;
  for (int i = 20; i >= 0; i--) {
    if (f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];
  }
  return f[x][0];
}
void modify (int x) {
  if (vis[x]) ans -= (p[c[x]] == 1), p[c[x]]--;
  else ans += (p[c[x]] == 0), p[c[x]]++;
  vis[x] ^= 1; 
}
int main () {
  ios::sync_with_stdio (false), cin.tie (0);
  cin >> n >> m; 
  d = max (1, (int)sqrt(n * 2));
  for (int i = 1; i <= n; i++) {
    cin >> c[i];
  }
  for (int i = 1; i < n; i++) {
    int u, v; cin >> u >> v;
    g[u].push_back (v);
    g[v].push_back (u);
  }
  init ();  
  dfs (1, 0);
  for (int i = 1; i <= m; i++) {
    int l, r; cin >> l >> r;
    if (l == r){
      q[i] = E{dfn[l][0], dfn[l][0], 0, i};
      continue;
    }
    if (dfn[l][0] > dfn[r][0]) swap (l, r);
    int lca = Lca (l, r);   
    if (lca == l) q[i] = E{dfn[r][1], dfn[l][0], 0, i};
    else if (lca == r) q[i] = E{dfn[l][1], dfn[r][0], 0, i};
    else q[i] = E{dfn[l][1], dfn[r][0], lca, i};
  }
  sort (q + 1, q + m + 1, cmp);
  int l = 1, r = 0;
  for (int i = 1; i <= m; i++) {
    while (l < q[i].l) modify (_dfn[l++]);
    while (l > q[i].l) modify (_dfn[--l]);
    while (r < q[i].r) modify (_dfn[++r]);  
    while (r > q[i].r) modify (_dfn[r--]);
    if (q[i]._lca) modify (q[i]._lca);
    res[q[i].id] = ans;
    if (q[i]._lca) modify (q[i]._lca);
  }
  for (int i = 1; i <= m; i++) cout << res[i] << '\n';
  return 0;
} 
2023/7/11 16:54
加载中...