LibreOJ 144. DFS 序 1
题面
给一棵有根树,这棵树由编号为 \(1\dots N\) 的 \(N\) 个结点组成。根结点的编号为 \(R\)。每个结点都有一个权值,结点 \(i\) 的权值为 \(v_i\)。
接下来有 \(M\) 组操作,操作分为两类:
1 a x,表示将结点 \(a\) 的权值增加 \(x\);2 a,表示求结点 \(a\) 的子树上所有结点的权值之和。
\(1\leqslant N, M\leqslant 10^6,\) \(1\leqslant R\leqslant N,\) \(-10^6\leqslant v_i, x\leqslant 10^6\).
思路
这道题树剖直接妥妥的 TLE,我们可以考虑用一些更简单的方法解决本题。
首先求 DFS 序,发现同一个子树的所有节点一定是在 DFS 序上的同一个区间的所有元素(显然),直接考虑树状数组维护。
时间复杂度 \(O((N+M)\log N)\),可以通过本题。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct edge{
	int nxt,to;
} g[1000005<<1];
int head[1000005],ec;
void add(int u,int v){
	g[++ec].nxt=head[u];
	g[ec].to=v;
	head[u]=ec;
}
int dfn[1000005],rev[1000005],v[1000005],ri[1000005];
int n,m,r;
int t[1000005];
int lowbit(int x){
	return x&(-x);
}
void update(int p,int v){
	while(p<=n){
		t[p]+=v;
		p+=lowbit(p);
	}
}
int query(int p){
	int ret=0;
	while(p){
		ret+=t[p];
		p-=lowbit(p);
	}
	return ret;
}
int dfnc;
void dfs(int u,int fa){
	rev[u]=(++dfnc);
	dfn[dfnc]=u;
	ri[u]=dfnc;
	update(dfnc,v[u]);
	for(int i=head[u];i;i=g[i].nxt){
		int v=g[i].to;
		if(v==fa)continue;
		dfs(v,u);
		ri[u]=max(ri[u],ri[v]);
	}
}
signed main(){
	cin>>n>>m>>r;
	for(int i=1;i<=n;i++){
		cin>>v[i];
	}
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		add(u,v);add(v,u);
	}
	dfs(r,0);
	while(m--){
		int op,a,x;
		cin>>op>>a;
		if(op==1){
			cin>>x;
			update(rev[a],x);
		}
		else{
			cout<<query(ri[a])-query(rev[a]-1)<<'\n';
		}
	}
	return 0;
}
												
											LibreOJ 144. DFS 序 1的更多相关文章
- DFS序和7种模型
		
DFS序就是将树的节点按照先根的顺序遍历得到的节点顺序 性质:一个子树全在一个连续的区间内,可以与线段树和树状数组搭配使用 很好写,只需在dfs中加几行代码即可. 代码: void dfs(ll u, ...
 - Libre OJ 144、145 (DFS序)
		
部分参考自博客:https://blog.csdn.net/hpu2022/article/details/81910490 在许多问题中,由于树结构复杂通常会导致问题很棘手,因为其实非线性结构,操作 ...
 - BZOJ_4034 [HAOI2015]树上操作 【树链剖分dfs序+线段树】
		
一 题目 [HAOI2015]树上操作 二 分析 树链剖分的题,这里主要用到了$dfs$序,这题比较简单的就是不用求$lca$. 1.和树链剖分一样,先用邻接链表建双向图. 2.跑两遍$dfs$,其实 ...
 - BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]
		
3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 1280 MBSubmit: 3127 Solved: 795[Submit][Status][Discu ...
 - BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]
		
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1352 Solved: 780[Submit][Stat ...
 - BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
		
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
 - 【BZOJ-3779】重组病毒      LinkCutTree + 线段树 + DFS序
		
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
 - 【BZOJ-1146】网络管理Network     DFS序 + 带修主席树
		
1146: [CTSC2008]网络管理Network Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 3495 Solved: 1032[Submi ...
 - 【Codeforces163E】e-Government     AC自动机fail树 + DFS序 + 树状数组
		
E. e-Government time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...
 - 【BZOJ-3881】Divljak      AC自动机fail树 + 树链剖分+ 树状数组 + DFS序
		
3881: [Coci2015]Divljak Time Limit: 20 Sec Memory Limit: 768 MBSubmit: 508 Solved: 158[Submit][Sta ...
 
随机推荐
- 记录一次成功反混淆脱壳及抓包激活app全过程
			
记录一次成功反混淆脱壳及抓包激活app全过程 前言  近期接到一个需求,要对公司之前开发的一款app进行脱壳.因为该app是两年前开发的,源代码文件已经丢失,只有加壳后的apk文件,近期要查看其中一 ...
 - golang中的init初始化函数
			
0.1.索引 https://waterflow.link/articles/1666090530880 1.概念 1.1.源文件里的代码执行顺序 init 函数是用于初始化应用程序状态的函数. 它不 ...
 - Linux进程间通信(二)
			
信号 信号的概念 信号是Linux进程间通信的最古老的一种方式.信号是软件中断,是一种异步通信的方式.信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某个突发事件. 一旦产生信号 ...
 - 浅入浅出 1.7和1.8的 HashMap
			
前言 HashMap 是我们最最最常用的东西了,它就是我们在大学中学习数据结构的时候,学到的哈希表这种数据结构.面试中,HashMap 的问题也是常客,现在卷到必须答出来了,是必须会的知识. 我在学习 ...
 - springMVC实现文件的上传和下载
			
文件的下载功能 @RequestMapping("/testDown")public ResponseEntity<byte[]> testResponseEntity ...
 - 全球名校AI课程库(38)| 马萨诸塞大学 · 自然语言处理进阶课程『Advanced Natural Language Processing』
			
课程学习中心 | NLP课程合辑 | 课程主页 | 中英字幕视频 | 项目代码解析 课程介绍 自然语言处理 (NLP) 是一门关于如何教计算机理解人类语言的工程艺术和科学.NLP 作为一种人工智能技术 ...
 - perl中sprintf函数的用法
			
对于某些字符串,需要输入为特定的格式,通过sprintf可以很方便的完成,不需要专门进行其他处理. 转载 perl中sprintf函数的使用方法.
 - C温故补缺(六):C反汇编常用的AT&Tx86语法
			
C语言反汇编用到的AT&T x86汇编语法 参考:CSDN1,CSDN2 默认gcc -S汇编出的,以及反汇编出的,都是AT&T x86代码,可以用-masm=intel指定为inte ...
 - esp-01和esp-01s烧录固件和程序
			
准备工具 USB-TTL 杜邦线若干 esp-01s烧录固件 我烧录的固件是 micropython, 使用的软件是 uPyCraft esp-01s烧录固件接线方法: esp-01s usb-ttl ...
 - chrom jsonview的使用
			
在开发中,我们可能要为不同的系统提供接口,并以说明文档的形式提供接口说明,但我们提供的返回json往往会在页面上乱成一团. 这里我们推荐chrome浏览器的小插件jsonview,他不但有利于我们对接 ...