E被卡常了
  • 板块学术版
  • 楼主FstAutoMaton
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/2/24 00:48
  • 上次更新2024/2/24 11:01:38
查看原帖
E被卡常了
677234
FstAutoMaton楼主2024/2/24 00:48

RT,好不容易想出来一个E但却被卡常了/fn,能省常数基本都省了,重心也没什么问题,但死活过不去。

#include <bits/stdc++.h>

using namespace std;
using LL = long long;

const int kMaxN = 2e5 + 5;

int vis[kMaxN], f[kMaxN], s[kMaxN], a[kMaxN], l[kMaxN], p, sz, rt, n, m, t;
int v[kMaxN], d[kMaxN], cnt[kMaxN];
LL ans;
vector<int> g[kMaxN];

void F(int u, int fa) {  //  找重心
  if (vis[u]) {
    return;
  }
  s[u] = 1, f[u] = 0;
  for (int i : g[u]) {
    if (i != fa) {
      F(i, u);
      s[u] += s[i];
      f[u] = max(f[u], s[i]);
    }
  }
  f[u] = max(f[u], sz - s[u]);
  (f[u] < f[rt]) && (rt = u);
}

void D(int u, int fa, int op) {
  d[++p] = u, l[p] = !v[a[u]], ans += cnt[a[u]] * (!v[a[u]]) * op;
  v[a[u]]++;
  for (int i : g[u]) {
    if (!vis[i] && i != fa) {
      D(i, u, op);
    }
  }
  v[a[u]]--;
}

void A(int u) {
  cnt[a[u]]++;
  for (register int id = 0; id < g[u].size(); id++) {
    int i = g[u][id];
    if (!vis[i]) {
      D(i, u, 1);
      for (register int j = 1; j <= p; j++) {
        int id = d[j];
        cnt[a[id]] += l[j] && a[id] != a[u];
      }
      p = 0;
    }
  }
  for (register int id = 0; id < g[u].size(); id++) {
    int i = g[u][id];
    if (!vis[i]) {
      D(i, u, 0);
      for (register int j = 1; j <= p; j++) {
        int id = d[j];
        cnt[a[id]] -= l[j] && a[id] != a[u];
      }
      p = 0;
    }
  }
  cnt[a[u]]--;
}

void S(int u) {
  vis[u] = 1;
  A(u);
  for (register int id = 0; id < g[u].size(); id++) {
    int i = g[u][id];
    if (!vis[i]) {
      rt = 0, sz = s[i], F(i, u);
      S(rt);
    }
  }
}

void C() {
  f[0] = 1e9;
  cin >> n;
  for (register int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  for (register int i = 1, u, v; i < n; i++) {
    cin >> u >> v;
    g[u].push_back(v), g[v].push_back(u);
  }
  rt = 0, sz = n, F(1, 0);
  S(rt);
  cout << ans << "\n";
  ans = 0;
  for (register int i = 1; i <= n; i++) {
    g[i].clear();
    vis[i] = f[i] = s[i] = 0;
  }
  p = sz = rt = 0;
}

int main() {
  ios ::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  for (cin >> t; t; t--) {
    C();
  }
  return 0;
}
2024/2/24 00:48
加载中...