求助卡常
查看原帖
求助卡常
369181
bamboo12345楼主2023/11/22 20:19

rt,卡不动了,求大佬帮卡

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5, mod = 201314;
int n, m;
struct qry {
	int id, x, val;
};
vector<qry> v[maxn];
vector<int> e[maxn];
int dep[maxn], f[maxn], top[maxn], dfn[maxn], rev[maxn], val[maxn], tot, sz[maxn], son[maxn];
long long ans[maxn];
void dfs1(int u) {
	dep[u] = dep[f[u]] + 1;
	sz[u] = 1;
	for (int i = 0; i < e[u].size(); i++) {
		int v = e[u][i];
		dfs1(v);
		sz[u] += sz[v];
		if(sz[son[u]] < sz[v])
			son[u] = v;
	}
}
void dfs2(int u, int t) {
	top[u] = t;
	dfn[u] = ++tot;
	rev[tot] = u;
	if(!son[u])
		return ;
	dfs2(son[u], son[u]);
	for (int i = 0; i < e[u].size(); i++) {
		int v = e[u][i];
		if(v == son[u])
			continue;
		dfs2(v, v);
	}
}
struct Segtree {
	long long tr[maxn << 2];
	int laz[maxn << 2];
	void pushup(int t) {
		tr[t] = tr[t << 1] + tr[t << 1 | 1];
	}
	void addtag(int l, int r, int t, int val) {
		tr[t] += 1ll * val * (r - l + 1), laz[t] += val;
	}
	void pushdown(int l, int r, int t) {
		int mid = l + r >> 1;
		addtag(l, mid, t << 1, laz[t]);
		addtag(mid + 1, r, t << 1 | 1, laz[t]);
		laz[t] = 0;
	}
	void update(int l, int r, int x, int y, int t, int val) {
		if(x <= l && r <= y) {
			addtag(l, r, t, val);
			return ;
		}
		int mid = l + r >> 1;
		pushdown(l, r, t);
		if(x <= mid)
			update(l, mid, x, y, t << 1, val);
		if(mid < y)
			update(mid + 1, r, x, y, t << 1 | 1, val);
		pushup(t);
	}
	int query(int l, int r, int x, int y, int t) {
		if(x <= l && r <= y)
			return tr[t];
		int mid = l + r >> 1;
		long long ans = 0;
		if(x <= mid)
			ans += query(l, mid, x, y, t << 1);
		if(mid < y)
			ans += query(mid + 1, r, x, y, t << 1 | 1);
		return ans;
	}
} tree;
void add(int x, int y) {
	while(top[x] != top[y]) {
		if(dep[top[x]] < dep[top[y]])
			swap(x, y);
		tree.update(1, n, dfn[top[x]], dfn[x], 1, 1);
		x = f[top[x]];
	}
	if(dep[x] > dep[y])
		swap(x, y);
	tree.update(1, n, dfn[x], dfn[y], 1, 1);
}
long long query(int x, int y) {
	long long ans = 0;
	while(top[x] != top[y]) {
		if(dep[top[x]] < dep[top[y]])
			swap(x, y);
		ans += tree.query(1, n, dfn[top[x]], dfn[x], 1);
		x = f[top[x]];
	}
	if(dep[x] > dep[y])
		swap(x, y);
	ans += tree.query(1, n, dfn[x], dfn[y], 1);
	return ans;
}
int read() {
	int sum = 0;
	char c = getchar();
	while(!isdigit(c))
		c = getchar();
	while(isdigit(c))
		sum = sum * 10 + c - '0', c = getchar();
	return sum;
}
signed main() {
//	freopen("test.in", "r", stdin);
//	freopen("test.out", "w", stdout);
	n = read(), m = read();
	for (int i = 2; i <= n; i++)
		f[i] = read(), f[i]++, e[f[i]].push_back(i);
	dfs1(1);
	dfs2(1, 1);
	for (int i = 1; i <= m; i++) {
		int l = read() + 1, r = read() + 1, x = read() + 1;
		v[r].push_back(qry{i, x, 1});
		v[l - 1].push_back(qry{i, x, -1});
	}
	for (int i = 1; i <= n; i++) {
		add(1, i);
		for (int j = 0; j < v[i].size(); j++)
			ans[v[i][j].id] += v[i][j].val * query(1, v[i][j].x);
	}
	for (int i = 1; i <= m; i++)
		printf("%lld\n", (ans[i]) % mod); 
	return 0;
}
2023/11/22 20:19
加载中...