求助
查看原帖
求助
680197
Mini_PEKKA楼主2023/8/15 21:46

主席树插入时,传入参数 rt[dep[a[i]]] 和 rt[dep[a[i - 1]]] 可能相同,这时应该没必要新开一个节点 u=++tot 吧,但是这样会 WA on test 43,求助大佬,错误代码如下:

#include <bits/stdc++.h>
#define int long long
#define ls(u) nd[u].l
#define rs(u) nd[u].r
using namespace std;
const int N = 1e5 + 5, INF = 0x3f3f3f3f3f3f3f3f;
int tot, tim, h[N], w[N], fa[N], siz[N], dfn[N], dep[N], a[N], rt[N];
struct edge {
	int v, next;
} e[N << 1];
struct SGT {
	int tot;
	struct node {
		int minw, l, r;
	} nd[N << 6];
	void insert(int& u, int v, int l, int r, int x, int val) {
		if(!u){///////////////删掉这两行就AC了
			u = ++tot;
			nd[u] = nd[v];
		}////////////////////
		if (nd[u].minw) {
			nd[u].minw = min(nd[u].minw, val);
		}
		else {
			nd[u].minw = val;
		}
		if (l == r) {
			return;
		}
		int mid = (l + r) >> 1;
		if (x <= mid) {
			insert(ls(u), ls(v), l, mid, x, val);
		}
		else {
			insert(rs(u), rs(v), mid + 1, r, x, val);
		}
	}
	int query(int u, int l, int r, int x, int y) {
		if (!u) {
			return INF;
		}
		if (x <= l && r <= y) {
			return nd[u].minw;
		}
		int mid = (l + r) >> 1;
		if (y <= mid) {
			return query(ls(u), l, mid, x, y);
		}
		if (x > mid) {
			return query(rs(u), mid + 1, r, x, y);
		}
		return min(query(ls(u), l, mid, x, y), query(rs(u), mid + 1, r, x, y));
	}
} sgt;
void add(int u, int v) {
	e[++tot] = {v, h[u]};
	h[u] = tot;
}
void dfs(int u) {
	siz[u] = 1;
	dfn[u] = ++tim;
	dep[u] = dep[fa[u]] + 1;
	for (int i = h[u]; i; i = e[i].next) {
		int v = e[i].v;
		if (v == fa[u]) {
			continue;
		}
		fa[v] = u;
		dfs(v);
		siz[u] += siz[v];
	}
}
signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int n, root, u, v, m, K;
	cin >> n >> root;
	for (int i = 1; i <= n; i++) {
		cin >> w[i];
	}
	for (int i = 1; i < n; i++) {
		cin >> u >> v;
		add(u, v);
		add(v, u);
	}
	dfs(root);
	for (int i = 1; i <= n; i++) {
		a[i] = i;
	}
	sort(a + 1, a + n + 1, [](int x, int y) {
		return dep[x] < dep[y];
	});
	for (int i = 1; i <= n; i++) {
		sgt.insert(rt[dep[a[i]]], rt[dep[a[i - 1]]], 1, n, dfn[a[i]], w[a[i]]);
	}
	cin >> m;
	int ans = 0;
	while (m--) {
		cin >> u >> K;
		u = (u + ans) % n + 1;
		K = (K + ans) % n;
		ans = sgt.query(rt[min(dep[u] + K, dep[a[n]])], 1, n, dfn[u], dfn[u] + siz[u] - 1);
		cout << ans << endl;
	}
	return 0;
}
2023/8/15 21:46
加载中...