求助,样例过了提交 0 pts
查看原帖
求助,样例过了提交 0 pts
406941
Register_int-std=c++14楼主2022/10/4 22:17

rt.下载数据后发现我输出一半对一半错,UB 也查完了,还是找不到问题 球球大佬们帮忙看看吧

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int MAXN = 5e4 + 10;
const int mod = 201314;

struct edge {
	int v, nxt;
} e[MAXN];

int tot, head[MAXN];

inline 
void add(int u, int v) {
	e[++tot] = { v, head[u] }, head[u] = tot;
}

int dep[MAXN], fa[MAXN], size[MAXN], son[MAXN];
int top[MAXN], id[MAXN], rev[MAXN], cnt;
	
void dfs1(int u, int f) {
	size[u] = 1, fa[u] = f, dep[u] = dep[f] + 1;
	for (int i = head[u], v; i; i = e[i].nxt) {
		v = e[i].v;
		if (v == f) continue;
		dfs1(v, u);
		size[u] += size[v];
		if (size[v] > size[son[u]]) son[u] = v;
	}
}
	
void dfs2(int u, int t) {
	top[u] = t, id[u] = ++cnt, rev[cnt] = u;
	if (!son[u]) return ;
	dfs2(son[u], t);
	for (int i = head[u], v; i; i = e[i].nxt) {
		v = e[i].v;
		if (v != fa[u] && v != son[u]) dfs2(v, v);
	}
}

struct node {
	int l, r;
	int add, sum;
} t[MAXN << 2];

inline 
int calc(int p) {
	return t[p].r - t[p].l + 1;
}

inline 
void pushup(int p) {
	t[p].sum = (t[p << 1].sum + t[p << 1 | 1].sum) % mod;
}

inline 
void pushdown(int p) {
	if (!t[p].add) return ;
	t[p << 1].add = (t[p << 1].add + t[p].add) % mod;
	t[p << 1 | 1].add = (t[p << 1 | 1].add + t[p].add) % mod;
	t[p << 1].sum = (t[p << 1].sum + t[p].add * calc(p << 1) % mod) % mod;
	t[p << 1 | 1].sum = (t[p << 1 | 1].sum + t[p].add * calc(p << 1 | 1) % mod) % mod;
	t[p].add = 0;
}

void build(int l, int r, int p) {
	t[p].l = l, t[p].r = r;
	if (l == r) return t[p].sum = 0, void();
	int mid = l + r >> 1;
	build(l, mid, p << 1), build(mid + 1, r, p << 1 | 1);
	pushup(p);
}

int query(int l, int r, int p) {
	if (l <= t[p].l && t[p].r <= r) return t[p].sum;
	pushdown(p);
	int mid = t[p].l + t[p].r >> 1, ans = 0;
	if (l <= mid) ans = (ans + query(l, r, p << 1)) % mod;
	if (r > mid) ans = (ans + query(l, r, p << 1 | 1)) % mod;
	return ans;
}

void update(int l, int r, int p, int k) {
	if (l <= t[p].l && t[p].r <= r) {
		t[p].add = (t[p].add + k) % mod;
		t[p].sum = (t[p].sum + k * calc(p) % mod) % mod;
		return ;
	}
	pushdown(p);
	int mid = t[p].l + t[p].r >> 1;
	if (l <= mid) update(l, r, p << 1, k);
	if (r > mid) update(l, r, p << 1 | 1, k);
	pushup(p);
}

inline 
int qrange(int x, int y) {
	int ans = 0;
	while (top[x] != top[y]) {
		if (dep[top[x]] < dep[top[y]]) swap(x, y);
		ans = (ans + query(id[top[x]], id[x], 1)) % mod;
		x = fa[top[x]];
	}
	if (dep[x] > dep[y]) swap(x, y);
	return (ans + query(id[x], id[y], 1)) % mod;
}

inline 
void urange(int x, int y, int k) {
	while (top[x] != top[y]) {
		if (dep[top[x]] < dep[top[y]]) swap(x, y);
		update(id[top[x]], id[x], 1, k);
		x = fa[top[x]];
	}
	if (dep[x] > dep[y]) swap(x, y);
	update(id[x], id[y], 1, k);
}

vector<int> v1[MAXN], v2[MAXN];

int res1[MAXN], res2[MAXN], z[MAXN];

int n, m;

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 2, x; i <= n; i++) scanf("%d", &x), add(x + 1, i);
	dfs1(1, 0), dfs2(1, 1), build(1, n, 1);
	for (int i = 1, l, r; i <= m; i++) {
		scanf("%d%d%d", &l, &r, &z[i]);
		l++, r++, z[i]++;
		v1[l - 1].push_back(z[i]), v2[r].push_back(z[i]);
	}
	for (int i = 1; i <= n; i++) {
		urange(1, i, 1);
		for (auto x : v1[i]) res1[x] = qrange(1, x);
		for (auto x : v2[i]) res2[x] = qrange(1, x);
	}
	for (int i = 1; i <= m; i++) printf("%d\n", (res2[z[i]] - res1[z[i]] + mod) % mod);
}
2022/10/4 22:17
加载中...