树剖求调
查看原帖
树剖求调
551108
Nuyoah_awa楼主2024/6/9 18:29

rt,全 Wa。

初步估计是弱智错误。

#include <iostream>
#include <cstdio>
#include <vector>
#define mid ((l+r)>>1)
#define ls (p<<1)
#define rs (ls^1)
#define int long long

using namespace std;

const int N = 1e5 + 5, MOD = 201314;
int n, m, fa[N], top[N], sz[N], dfn[N], dfsid, hs[N], ans[N<<1], t[N<<2], tag[N<<2];
struct node{
	int val, id;
};
vector <int> e[N];
vector <node> g[N];

int dfs1(int x)
{
	dfn[x] = ++dfsid, sz[x] = 1ll, top[x] = x;
	for(int i = 0ll;i < e[x].size();i++)
	{
		sz[x] += dfs1(e[x][i]);
		if(sz[e[x][i]] > sz[hs[x]])
			hs[x] = e[x][i];
	}
	return sz[x];
}

void dfs2(int x)
{
	if(hs[x])
	{
		top[hs[x]] = top[x];
		dfs2(hs[x]);
	}
	for(int i = 0ll;i < e[x].size();i++)
		if(e[x][i] != hs[x])
			dfs2(e[x][i]);
}

void push_down(int p, int l, int r)
{
	if(tag[p] == 0ll)	return ;
	(t[ls] += tag[p] * (mid - l + 1ll) % MOD) %= MOD, (tag[ls] += tag[p]) %= MOD;
	(t[rs] += tag[p] * (r - mid) % MOD) %= MOD, (tag[rs] += tag[p]) %= MOD;
	tag[p] = 0ll;
}
void push_up(int p){t[p] = (t[ls] + t[rs]) % MOD;}

void update(int p, int l, int r, int ll, int rr, int val)
{
	if(ll <= l && r <= rr)
	{
		(t[p] += val * (r - l + 1ll) % MOD) %= MOD, (tag[p] += val) %= MOD;
		return ;
	}
	push_down(p, l, r);
	if(ll <= mid)	update(ls, l, mid, ll, rr, val);
	if(rr > mid)	update(rs, mid + 1ll, r, ll, rr, val);
	push_up(p);
}

int query(int p, int l, int r, int ll, int rr)
{
	if(ll <= l && r <= rr)	return t[p];
	push_down(p, l, r);
	int res = 0ll;
	if(ll <= mid)	(res += query(ls, l, mid, ll, rr)) %= MOD;
	if(rr > mid)	(res += query(rs, mid + 1ll, r, ll, rr)) %= MOD;
	return res;
}

void add(int x)
{
	while(top[x] != 1ll)
	{
		update(1ll, 1ll, n, dfn[top[x]], dfn[x], 1ll);
		x = fa[top[x]];
	}
	update(1ll, 1ll, n, dfn[top[x]], dfn[x], 1ll);
}

int solve(int x)
{
	int res = 0ll;
	while(top[x] != 1ll)
	{
		(res += query(1ll, 1ll, n, dfn[top[x]], dfn[x])) %= MOD;
		x = fa[top[x]];
	}
	(res += query(1ll, 1ll, n, dfn[top[x]], dfn[x])) %= MOD;
	return res;
}

signed main()
{
	scanf("%lld %lld", &n, &m);
	for(int i = 2ll;i <= n;i++)
	{
		scanf("%lld", &fa[i]);
		e[++fa[i]].push_back(i);
	}
	dfs1(1ll);
	dfs2(1ll);
	for(int p = 1ll, l, r, z;p <= m;p++)
	{
		scanf("%lld %lld %lld", &l, &r, &z);
		z++, r++;
		g[l].push_back({z, ls});
		g[r].push_back({z, rs});
	}
	for(int i = 1ll;i <= n;i++)
	{
		add(i);
		for(int j = 0ll;j < g[i].size();j++)
			ans[g[i][j].id] = solve(g[i][j].val);
	}
	for(int p = 1ll;p <= m;p++)
		printf("%lld\n", (ans[rs] - ans[ls] + MOD) % MOD);
	return 0;
}
2024/6/9 18:29
加载中...