P11855 [CSP-J2022 山东] 部署

题目传送门

水题!
第一眼以为是根号分治。

由于题目的要求是全部 m m m 次命令执行完之后才询问,这意味着可以像差分一样最后统一跑一遍求出答案。

命令 2,我们可以打标记处理, d d a x dda_x ddax 表示所有与点 x x x 相邻的点需要增加的数量,最后全部加上就行了。

cpp 复制代码
for(int x=1;x<=n;x++){
		for(int i=0;i<a[x].size();i++){
			int y=a[x][i];
			ans[x]+=dda[y];
		}
	}

因为是树,只有 n − 1 n-1 n−1 条边,时间复杂度 O ( N ) O(N) O(N)。

对于命令 1,将点 x x x 的子树全部加上一个数,修改一堆,查询一个,容易想到差分。

还是标记, a d d x add_x addx 表示点 x x x 及其子树需要加上的数,最后从根节点往下 dfs 一遍即可求出。

cpp 复制代码
void dfs(int x,int fa,int sum){
	sum+=add[x];//先更新 sum,当前的点也是子树的一部分
	ans[x]+=sum;
	for(int i=0;i<a[x].size();i++){
		int y=a[x][i];
		if(y==fa)continue;
		dfs(y,x,sum);
	}
}

code

cpp 复制代码
#include<bits/stdc++.h>
#define int long long
#define endl putchar('\n')
using namespace std;
const int N=1e6+5;
int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
	return x*f;
}
void print(int x){
	if(x<0)putchar('-'),x=-x;
	if(x<10){putchar(x+'0');return;}
	print(x/10);
	putchar(x%10+'0');
}
void putstr(string s){
	for(int i=0;i<s.size();i++)putchar(s[i]);
}
int n,m;
int ans[N];
int d[N];
vector<int>a[N];
int add[N];
int dda[N];
void dfs(int x,int fa,int sum){
	sum+=add[x];
	ans[x]+=sum;
	for(int i=0;i<a[x].size();i++){
		int y=a[x][i];
		if(y==fa)continue;
		dfs(y,x,sum);
	}
}
signed main(){
	n=read();
	for(int i=1;i<=n;i++)ans[i]=read();
	for(int i=1;i<n;i++){
		int u=read(),v=read();
		a[u].push_back(v);
		a[v].push_back(u);
	}
	m=read();
	while(m--){
		int op=read(),x=read(),y=read();
		if(op==2){
			ans[x]+=y,dda[x]+=y;
		}
		else{
			add[x]+=y;
		}
	}
	for(int x=1;x<=n;x++){
		for(int i=0;i<a[x].size();i++){
			int y=a[x][i];
			ans[x]+=dda[y];
		}
	}
	dfs(1,1,0);
	int q=read();
	while(q--){
		int x=read();
		print(ans[x]),endl;
	}
}
相关推荐
talenteddriver16 分钟前
java: Java8以后hashmap扩容后根据高位确定元素新位置
java·算法·哈希算法
跨境猫小妹40 分钟前
2025 TikTok Shop:从内容爆发到系统化深耕的商业跃迁
大数据·人工智能·算法·产品运营·亚马逊
不穿格子的程序员43 分钟前
从零开始写算法 —— 二叉树篇 1:二叉树的三种遍历(递归实现法)
算法·深度优先·二叉树遍历·fds
子夜江寒1 小时前
逻辑森林与贝叶斯算法简介
算法·机器学习
xu_yule1 小时前
算法基础-背包问题(01背包问题)
数据结构·c++·算法·01背包
我不是小upper2 小时前
从理论到代码:随机森林 + GBDT+LightGBM 融合建模解决回归问题
人工智能·深度学习·算法·随机森林·机器学习·回归
budingxiaomoli2 小时前
分治算法-快排
数据结构·算法
云泽8082 小时前
C++ STL 栈与队列完全指南:从容器使用到算法实现
开发语言·c++·算法
前端小白在前进3 小时前
力扣刷题:复原IP地址
tcp/ip·算法·leetcode
yaoh.wang3 小时前
力扣(LeetCode) 94: 二叉树的中序遍历 - 解法思路
python·算法·leetcode·面试·职场和发展·二叉树·跳槽