WA,只过了#5,求条玄关
查看原帖
WA,只过了#5,求条玄关
991551
glx123楼主2025/7/18 21:36

样例过了,但#1的回答和答案差的很多

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

typedef long long LL;

const int N = 50010, M = 100010, mod = 201314;

int n, m;
int h[N], e[M], ne[M], idx;
int fa[N], sz[N], dep[N], son[N], top[N];
int dfn[N], rev[N], timestamp;
int res[2][N];

struct Node
{
	int x, id, z;
	bool f;
	bool operator < (const Node &W) const
	{
		return x < W.x;
	}
}q[N * 2];

struct Tree
{
	int l, r;
	int sum, add;
}tr[N * 4];

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

void pushdown(int p)
{
	if (tr[p].add)
	{
		Tree &ls = tr[p << 1], &rs = tr[p << 1 | 1];
		int v = tr[p].add;
		ls.sum += (LL)(ls.r - ls.l + 1) * v % mod, ls.add = (ls.add + v) % mod;
		rs.sum += (LL)(rs.r - rs.l + 1) * v % mod, rs.add = (rs.add + v) % mod;
		tr[p].add = 0;
	}
}

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

void modify(int p, int l, int r, int k)
{
	if (l <= tr[p].l && r >= tr[p].r)
		tr[p].sum = (tr[p].sum + (tr[p].r - tr[p].l + 1) * k % mod) % mod, tr[p].add = (tr[p].add + k) % mod;
	else
	{
		pushdown(p);
		int mid = tr[p].l + tr[p].r >> 1;
		if (l <= mid) modify(p << 1, l, r, k);
		if (r > mid) modify(p << 1 | 1, l, r, k);
		pushup(p);
	}
}

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

void add(int a, int b)
{
	e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}

void dfs1(int u)
{
	sz[u] = 1, dep[u] = dep[fa[u]] + 1;
	for (int i = h[u]; ~i; i = ne[i])
	{
		int j = e[i];
		dfs1(j);
		sz[u] += sz[j];
		if (sz[j] > sz[son[u]])
			son[u] = j;
	}
}

void dfs2(int u, int t)
{
	top[u] = t, dfn[u] = ++ timestamp, rev[timestamp] = u;
	
	if (!son[u]) return;
	dfs2(son[u], t);
	
	for (int i = h[u]; ~i; i = ne[i])
	{
		int j = e[i];
		if (j != son[u])
			dfs2(j, j); 
	}
}

void change(int u)
{
	while (top[u] != 1)
	{
		modify(1, dfn[top[u]], dfn[u], 1);
		u = fa[top[u]];
	}
	modify(1, 1, dfn[u], 1);
}

int qsum(int u)
{
	int res = 0;
	while (top[u] != 1)
	{
		res += query(1, dfn[top[u]], dfn[u]);
		u = fa[top[u]];
	}
	return res + query(1, 1, dfn[u]);
}

int main()
{
	//freopen("P4211_1.in", "r", stdin); 
	
	memset(h, -1, sizeof h);
	
	cin >> n >> m;
	for (int i = 2; i <= n; i ++ )
	{
		cin >> fa[i];
		fa[i] ++ ;
		add(fa[i], i); 
	}
	
	
	
	dfs1(1), dfs2(1, 1);
	
	build(1, 1, n);
	
	//for (int i = 1; i <= n; i ++ ) cout << dfn[i] << " ";
	//puts("");
	
	int cnt = 0;
	for (int i = 1; i <= m; i ++ )
	{
		int l, r, z;
		cin >> l >> r >> z;
		l ++ , r ++ , z ++ ;
		q[cnt ++ ] = {r, i, z, 0};
		if (l - 1 >= 1) q[cnt ++ ] = {l - 1, i, z, 1};
	} 
	
	sort(q, q + cnt);
	
	//for (int i = 0; i < cnt; i ++ ) cout << q[i].x << " ";
	//puts("");
	
	for (int i = 1, j = 0; i <= n && j < cnt; i ++ )
	{
		change(i);
		while (j < cnt && q[j].x == i)
        {
            res[q[j].f][q[j].id] = qsum(q[j].z); 
            j ++ ;
        }
	}
	
	for (int i = 1; i <= m; i ++ ) cout << ((res[0][i] - res[1][i]) % mod + mod) % mod << "\n";
	puts("");
	
	return 0;
}
2025/7/18 21:36
加载中...