WA on #1 求助!!
查看原帖
WA on #1 求助!!
507534
YBaggio楼主2023/7/11 15:30
#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], 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;
  a[tot] = c[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;
} 
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 = 18; i >= 0; i--) {
    if (dep[f[x][i]] >= dep[y]) x = f[x][i]; 
  }
  if (x == y) return x;
  for (int i = 18; 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[a[x]] == 0);
  else ans += (++p[a[x]] == 1);
  vis[x] ^= 1; 
}
int main () {
  ios::sync_with_stdio (false), cin.tie (0);
  cin >> n >> m; 
  d = n * 2 / sqrt (m * 2 / 3);
  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, 1);
  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 (dep[l] > dep[r]) swap (l, r);
    int lca = Lca (l, r);   
    if (lca == l) q[i] = E{dfn[r][1], dfn[l][0], 0, i};
    else {
      if (dfn[l][1] < dfn[r][0]) q[i] = E{dfn[l][1], dfn[r][0], dfn[lca][0], i};
      else q[i] = E{dfn[r][1], dfn[l][0], dfn[lca][0], 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 (l++);
    while (l > q[i].l) modify (--l);
    while (r < q[i].r) modify (++r);
    while (r > q[i].r) modify (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 15:30
加载中...