谢谢
查看原帖
谢谢
1198462
dvsfanjo楼主2024/8/22 14:19

马蜂能懂,玄关求条,样例第一问过不了。

听说内容和标题互换会多来点人

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5 + 5;
vector <ll> G[N];
ll n, m, r, p, x, y, z, cnt, op, u, v, k;
ll fa[N], dep[N], sz[N], son[N], top[N], val[N], ide[N], nw[N], t[N << 2], la[N << 2];
void dfs1(ll u, ll f)
{
	dep[u] = dep[f] + 1;
	fa[u] = f;
	sz[u] = 1;
	for (auto g : G[u])
		if (g != f)
		{
			dfs1(g, u);
			sz[u] += sz[g];
			if (sz[g] > sz[son[u]])
				son[u] = g;
		}
	return;
}
void dfs2(ll u, ll t)
{
	top[u] = t;
	ide[u] = ++cnt;
	nw[cnt] = val[u];
	if (!son[u])
		return;
	dfs2(son[u], t);
	for (auto g : G[u])
		if (g != son[u] and g != fa[u])
			dfs2(g, g);
	return;
}
ll ls(ll i) {return i << 1;}
ll rs(ll i) {return i << 1 | 1;}
void build(ll l, ll r, ll i)
{
	if (l == r)
	{
		t[i] = nw[l];
		return;
	}
	ll mid = (l + r) >> 1;
	build(l, mid, ls(i));
	build(mid + 1, r, rs(i));
	t[i] = (t[ls(i)] + t[rs(i)]) % p;
	return;
}
void spread(ll l, ll r, ll i)
{
	if (!la[i])
		return;
	ll mid = (l + r) >> 1;
	la[ls(i)] += la[i] % p;
	la[ls(i)] %= p;
	la[rs(i)] += la[i] % p;
	la[rs(i)] %= p;
	la[i] = 0;
	t[ls(i)] += (mid - l + 1) * la[ls(i)] % p;
	t[ls(i)] %= p;
	t[rs(i)] += (r - mid) * la[rs(i)] % p;
	t[rs(i)] %= p;
	t[i] = (t[ls(i)] + t[rs(i)]) % p;
	return;
}
void update(ll l, ll r, ll i, ll x, ll y, ll v)
{
	spread(l, r, i);
	if (x <= l and r <= y)
	{
		la[i] += v;
		la[i] %= p;
		t[i] += v * (r - l + 1) % p;
		t[i] %= p;
		return;
	}
	spread(l, r, i);
	ll mid = (l + r) >> 1;
	if (x <= mid)
		update(l, mid, ls(i), x, y, v);
	if (mid < y)
		update(mid + 1, r, rs(i), x, y, v);
	t[i] = (t[ls(i)] + t[rs(i)]) % p;
	return;
}
ll query(ll l, ll r, ll i, ll x, ll y)
{
	if (x <= l and r <= y)
		return t[i];
	ll mid = (l + r) >> 1, ans = 0;
	if (x <= mid)
		ans += query(l, mid, ls(i), x, y);
	ans %= p;
	if (mid < y)
		ans += query(mid + 1, r, rs(i), x, y);
	ans %= p;
	return ans;
}
void lca_update(ll u, ll v, ll k)
{
	while (top[u] != top[v])
	{
		if (dep[top[u]] < dep[top[v]])
			swap(u, v);
		update(1, n, 1, ide[top[u]], ide[u], k);
		u = fa[top[u]];
	}
	update(1, n, 1, ide[top[u]], ide[u], k);
	return;
}
ll lca_query(ll u, ll v)
{
	ll ans = 0;
	while (top[u] != top[v])
	{
		if (dep[top[u]] < dep[top[v]])
			swap(u, v);
		ans = (ans + query(1, n, 1, ide[top[u]], ide[u])) % p;
		u = fa[top[u]];
	}
	if (dep[u] < dep[v])
		swap(u, v);
	ans = (ans + query(1, n, 1, ide[top[u]], ide[u])) % p;
	return ans;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> m >> r >> p;
	for (int i = 1; i <= n; i++)
		cin >> val[i];
	for (int i = 1; i < n; i++)
	{
		cin >> x >> y;
		G[x].push_back(y);
		G[y].push_back(x);
	}
	dfs1(r, 0);
	dfs2(r, 0);
	build(1, n, 1);
	while (m--)
	{
		cin >> op;
		if (op == 1)
		{
			cin >> u >> v >> k;
			lca_update(u, v, k);
		}
		else if (op == 2)
		{
			cin >> u >> v;
			cout << lca_query(u, v) << '\n';
		}
		else if (op == 3)
		{
			cin >> u >> k;
			update(1, n, 1, ide[u], ide[u] + sz[u] - 1, k);
		}
		else if (op == 4)
		{
			cin >> u;
			cout << query(1, n, 1, ide[u], ide[u] + sz[u] - 1) << '\n';
		}
	}
	return 0;
}
2024/8/22 14:19
加载中...