RE + WA + MLE玄关求调
查看原帖
RE + WA + MLE玄关求调
510085
xwj01楼主2024/7/9 20:16
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int n, m, c, x, y, ans, v[maxn];
vector<int> g[maxn], df[maxn];
int fa[maxn], fa_dis[maxn];
int d[maxn], f[maxn][20];
int sum, siz[maxn], weight[maxn] = {0x7fffffff}, centroid = 0;
bool vis[maxn];
int tree[maxn << 8], lc[maxn << 8], rc[maxn << 8], tot = 0, root[maxn][2], s[maxn], tots;
stack<int>stk;

void dfs(int u) {
	for (int v : g[u]) {
		if (d[v]) continue;
		d[v] = d[u] + 1;
		f[v][0] = u;
		for (int i = 1; i <= 18; ++i)
			f[v][i] = f[f[v][i - 1]][i - 1];
		dfs(v);
	}
}
int lca(int x, int y) {
	if (d[x] < d[y]) swap(x, y);
	for (int i = 18; i >= 0; --i)
		if (d[f[x][i]] >= d[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];
}

int dist(int x, int y) {
	int l = lca(x, y);
	return d[x] + d[y] - 2 * d[l];
}

void update(int p) {
	tree[p] = tree[lc[p]] + tree[rc[p]];
}

void change(int &p, int l, int r, int x, int d) {
	if (!p) p = ++tot;
	if(tot > 5e5)
		tot = 0;
	if (l == r) {
		tree[p] += d;
		return;
	}
	int mid = (l + r) >> 1;
	x <= mid ? change(lc[p], l, mid, x, d) : change(rc[p], mid + 1, r, x, d);
	update(p);
}

int ask(int p, int l, int r, int y) {
	if (!p) return 0;
	if (l >= 0 && r <= y) return tree[p];
	int mid = (l + r) >> 1;
	int res = 0;
	if (0 <= mid) res += ask(lc[p], l, mid, y);
	if (y > mid) res += ask(rc[p], mid + 1, r, y);
	return res;
}

void calcsize(int u, int fa) {
	siz[u] = 1;
	weight[u] = 0;
	for (int v : g[u]) {
		if (v == fa || vis[v]) continue;
		calcsize(v, u);
		siz[u] += siz[v];
		weight[u] = max(weight[u], siz[v]);
	}
	weight[u] = max(weight[u], sum - siz[u]);
	if (weight[u] < weight[centroid]) centroid = u;
}
void build(int u) {
	vis[u] = true;
	for (int i = u; i; i = fa[i]) {
		change(root[i][0], 1, n, dist(u, i), v[u]);
		if(fa[i])
			change(root[i][1], 1, n, dist(fa[i], u), v[u]);
	}
	for (int v : g[u]) {
		if (vis[v]) continue;
		centroid = 0;
		weight[0] = 0x3fffffff;
		sum = siz[v];
		calcsize(v, u);
		calcsize(centroid, 0);
		fa[centroid] = u;
		df[u].push_back(centroid);
		build(centroid);
	}
}

int main() {
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; ++i) scanf("%d", &v[i]);
	for (int i = 1, u, v; i < n; ++i) {
		scanf("%d %d", &u, &v);
		g[u].push_back(v);
		g[v].push_back(u);
	}
	d[1] = 1;
	dfs(1);
	cout<<"dfs ok\n";
	sum = n;
	calcsize(1, 0);
	calcsize(centroid, 0);
	fa[centroid] = 0;
	build(centroid);
	cout<<"build ok\n";
	while (m--) {
		scanf("%d %d %d", &c, &x, &y);
		x ^= ans;
		y ^= ans;
		
		if (c) {
			for (int i = x; i; i = fa[i]) {
				change(root[i][0], 1, n, dist(x, i), y - v[x]);
				if(fa[i])
					change(root[i][1], 1, n, dist(fa[i], x), y - v[x]);
			}
			v[x] = y;
		} else {
			ans = ask(root[x][0], 1, n, y);
			for (int i = fa[x]; i; i = fa[i]) {
				int d = dist(i, x);
				ans += ask(root[i][0], 1, n, y - d);
				ans -= ask(root[i][1], 1, n, y - d);
			}
			printf("%d\n", ans);
		}
	}
	return 0;
}

WA on #3

MEL on #2

RE on #1、4、5、6、7、8、9、10

2024/7/9 20:16
加载中...