学习离线处理 [CSP-J 2022 山东] 部署

CSP-J 2022 山东 部署

今天学习一下离线处理.

所谓离线, 就是等你操作完了后再问你问题, 每一次操作时间复杂度可能很大, 我们可以把操作堆起来最后一遍完成.

我们不妨记录两个内容, 一个是操作一在节点 u u u 要求增加的兵, 不妨将其设为 f ( u ) f(u) f(u); 一个是操作二在节点 u u u 要求增加的兵, 不妨将其设为 g ( u ) g(u) g(u).

我们首先记录所有操作,

cpp 复制代码
for(int op,x,y;m--;){
	std::cin>>op>>x>>y;
	if(op==1)f[x]+=y;
	else g[x]+=y;
}

我们记录完之后, 就是要统计答案了. 我们不妨先思考操作二该怎么统计.

首先对于节点 u u u 而言, 其兵力增加就是 g ( u ) g(u) g(u), 而对于其子节点和祖先而言, 兵力都要增加 g ( u ) g(u) g(u).

cpp 复制代码
void dfs(int u,int fa){
	ans[u]+=g[u];
	for(auto v:e[u]){
		ans[v]+=g[u];//祖先兵力也要增加, 故能跑的点兵力都要增加 g(u)
		if(v^fa)dfs(v,u);//显然深搜不能回到祖先
	}
}

我们再思考操作一该怎么统计.

首先对于节点 u u u 而言, 其增加的兵力就是 f ( u ) f(u) f(u). 但问题来了, 它的子树都要增加 f ( u ) f(u) f(u). 我们把增加的 f ( u ) f(u) f(u) 向下传即可.

cpp 复制代码
void dfs(int u,int fa,LL down){
	ans[u]+=f[u]+down;
	for(auto v:e[u])
		if(v^fa)dfs(v,u,down+f[u]);
}

最后展示总代码, 当然肯定与上述有部分出入.

cpp 复制代码
#include<iostream>
#include<vector>
#define P(A) A=-~A
#define NUMBER1 1000000
typedef long long LL;
typedef std::pair<int,LL> PLL;
int n;
LL ans[NUMBER1+5];
std::vector<std::vector<int>>e;
PLL c[NUMBER1+5];
void dfs(int u,int fa){
	ans[u]+=c[u].first+c[u].second;
	for(auto v:e[u]){
		ans[v]+=c[u].second;
		if(v^fa){
			c[v].first+=c[u].first;	
			dfs(v,u);
		}
	}
}
signed main(){
	std::cin.tie(nullptr)->std::ios::sync_with_stdio(false);
	std::cout.tie(nullptr);
	std::cin>>n;
	e.assign(n+1,std::vector<int>());
	for(int i=1;i<=n;P(i))std::cin>>ans[i];
	for(int i=1,u,v;i<n;P(i)){
		std::cin>>u>>v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	int m,q;
	std::cin>>m;
	for(int op,x,y;m--;){
		std::cin>>op>>x>>y;
		if(op==1)c[x].first+=y;
		else c[x].second+=y;
	}
	dfs(1,0);
	std::cin>>q;
	for(int u;q--;){
		std::cin>>u;
		std::cout<<ans[u]<<'\n';
	}
	return 0;
}
相关推荐
点心的游戏开发世界1 小时前
Unity C# 脚本学习笔记:命名空间与 using
学习·unity·c#
香芋芋圆2 小时前
AI 冲击内卷之下,普通前端如何破局?WebGIS—— 低门槛突围赛道
前端·javascript·人工智能·学习·职场发展
淡海水3 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
点心的游戏开发世界3 小时前
Unity C# 脚本学习笔记:泛型
学习·unity·c#
leobertlan3 小时前
好玩系列:训练一个神经网络模型指导小孩玩游戏2-大局观教练
算法
Tisfy4 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
tju新生代魔迷4 小时前
Verilog HDL 学习笔记(十三)| 第13章 编程语言接口(PLI)
笔记·学习
乐迪信息5 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉
kiracrimson5 小时前
从缓存的角度看链表与线性表的差异
数据结构·链表·缓存
木井巳6 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法