Codeforces 1076E. Vasya and a Tree

传送门
\(\texttt{Difficulty:1900}\)

题目大意

一棵 \(n(1\le n\le 3\cdot10^5)\) 个节点以 \(1\) 为根的树,所有节点的权值为 \(0\) ,进行 \(m(1\le m\le3\cdot10^5)\) 次操作,每次操作将节点 \(v\)\(d-\) 子树 \((0\le d\le10^9)\) (即子树内与距离 \(v\le d\) 的所有节点),内的所有节点的值加上 \(x(1\le x\le 10^9)\) 。求所有操作结束后,每个点的权值。

思路

考虑离线,将所有的操作分配到每个节点上 ,我们进行 \(dfs\),我们记录一个前缀和 \(sum\) 来代表当前节点最终会加上的答案,对于每个节点 \(v\) 上的每一个操作 \((d, x)\) ,我们对深度 \(dep_v+d+1\) 的标记减去 \(x\) ,代表这一个操作在该深度时失效,同时将 \(sum\) 加上 \(x+tag_{dep_v}\)即可,此时的 \(sum\) 即为 \(v\) 的答案,之后回溯的时候做对称地操作消除该节点上操作的影响即可,复杂度 \(O(n+m)\)

代码

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
using LL = long long;
using LD = long double;
using ULL = unsigned long long;
using PII = pair<LL, LL>;
using TP = tuple<int, int, int>;
#define all(x) x.begin(),x.end()
#define pb push_back
//#define int LL
//#define lc p*2
//#define rc p*2+1
#define endl '\n'
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#pragma warning(disable : 4996)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
const double eps = 1e-8;
const LL MOD = 1000000007;
const LL mod = 998244353;
const int maxn = 300010;

vector<int>G[maxn];
vector<PII>Q[maxn];
LL N, M, A[maxn], tag[maxn], sum = 0;

void add_edge(int from, int to)
{
	G[from].push_back(to);
	G[to].push_back(from);
}

void dfs(int v, int p, int d)
{
	for (auto& [x, y] : Q[v])
	{
		sum += y;
		if (d + x + 1 < N)
			tag[d + x + 1] -= y;
	}
	sum += tag[d];
	A[v] += sum;
	for (auto& to : G[v])
	{
		if (to == p)
			continue;
		dfs(to, v, d + 1);
	}
	for (auto& [x, y] : Q[v])
	{
		sum -= y;
		if (d + x + 1 < N)
			tag[d + x + 1] += y;
	}
	sum -= tag[d];
}

void solve()
{
	cin >> M;
	int v, d, x;
	for (int i = 1; i <= M; i++)
	{
		cin >> v >> d >> x;
		Q[v].push_back(PII(d, x));
	}
	dfs(1, 0, 0);
	for (int i = 1; i <= N; i++)
		cout << A[i] << ' ';
	cout << endl;
}

int main()
{
	IOS;
	cin >> N;
	int u, v;
	for (int i = 1; i < N; i++)
		cin >> u >> v, add_edge(u, v);
	solve();

	return 0;
}
posted @ 2022-06-08 16:59  Prgl  阅读(30)  评论(0)    收藏  举报