求助
查看原帖
求助
765954
c______楼主2024/12/26 01:36

求调代码:

本地测评和洛谷ide测评输出结果不一样

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e5 + 5;

list<int> e[N];
int n, m, T, idx, qcnt, ccnt;
int v[N], w[N], c[N], in[N], out[N], id[N], dep[N], pos[N], dct[N], cnt[N];
bool vis[N];
ll cur, ans[N];
//id:eluar序 in, out:入出
int fa[N][22];

struct node{
	int l, r, t, id;
	bool operator<(const node &f) const{
		if (pos[l] != pos[f.l])
			return pos[l] < pos[f.l];
		if (pos[r] != pos[f.l])
			return pos[r] < pos[f.r];
		return t <= f.t;
	}
}q[N];
struct nodes{
	int x, c, t;
}Q[N];

void dfs(int u){
	id[in[u] = ++ idx] = u;
	for (int v : e[u]){
		if (v == fa[u][0]) continue;
		fa[v][0] = u, dep[v] = dep[u] + 1;
		dfs(v);
	}
	id[out[u] = ++ idx] = u;
}

int lca(int x, int y){
	if (dep[x] < dep[y]) swap(x, y);
	while (dep[x] != dep[y]){
		int dis = dep[x] - dep[y];
		for (int i = 20; i >= 0; i --){
			if (dis >= (1 << i))
				dis -= (1 << i), x = fa[x][i];
		}
	}
	if (x == y) return x;
	for (int i = 20; i >= 0; i --){
    if (fa[x][i] != fa[y][i]) 
		x = fa[x][i], y = fa[y][i];
  }
  return fa[x][0];
}

void add(int x){
  if (vis[x]) cur -= 1ll * v[c[x]] * w[cnt[c[x]] --];
  else cur += 1ll * v[c[x]] * w[++ cnt[c[x]]];
  vis[x] ^= 1;
}

void modify(int x, int y){
  if (vis[x]) add(x), c[x] = y, add(x);
  else c[x] = y;
}

void solve(){
	// read(n), read(m), read(T);
	cin >> n >> m >> T;
	for (int i = 1; i <= m; i ++) cin >> v[i];//read(v[i]);
	for (int i = 1; i <= n; i ++) cin >> w[i];//read(w[i]);
	for (int i = 1, u, v; i < n; i ++){
		// read(u), read(v);
		cin >> u >> v;
		e[u].push_back(v), e[v].push_back(u);
	}
	for (int i = 1; i <= n; i ++) cin >> dct[i], c[i] = dct[i];
	dfs(1);
	for (int j = 1; j <= 20; j ++)
		for (int i = 1; i <= n; i ++)
			fa[i][j] = fa[fa[i][j - 1]][j - 1];
	int Bs = pow(idx, 2. / 3);
	for (int i = 1; i <= idx; i ++)
		pos[i] = (i - 1) / Bs;
	for (int i = 1, op, x, y; i <= T; i ++){
		// read(op), read(x), read(y);
		cin >> op >> x >> y;
		if (op == 0) ++ ccnt, Q[ccnt] = (nodes){x, dct[x], y}, dct[x] = y;
		else{
			if (in[x] > in[y]) swap(x, y);
			++ qcnt, q[qcnt] = (node){lca(x, y) == x ? in[x] : out[x], in[y], ccnt, qcnt};
		}
	}
	sort(q + 1, q + 1 + qcnt);
  // return;
	int L = 0, R = 0, t = 1;
	for (int i = 1; i <= qcnt; i ++){
		while (t <= q[i].t) modify(Q[t].x, Q[t ++].t);
		while (t > q[i].t) modify(Q[t].x, Q[t --].c);
		while (L > q[i].l) add(id[-- L]);
		while (L < q[i].l) add(id[L ++]);
		while (R > q[i].r) add(id[R --]);
		while (R < q[i].r) add(id[++ R]);
    int x = id[L], y = id[R];
    int LCA = lca(x, y);
    if (x != LCA && y != LCA){
      add(LCA);
      ans[q[i].id] = cur;
      add(LCA);
    }
    else
      ans[q[i].id] = cur;
      // cout << q[i].id << ":" << cur << '\n';
	}
  for (int i = 1; i <= qcnt; i ++)
    cout << ans[i] << '\n';
}

int main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	// read(T);
	// while (T --)
		solve();
	return 0;
}
2024/12/26 01:36
加载中...