suoi08 一收一行破 (tarjanLca+树状数组)
用一个差分树状数组维护一下每个深度的和,然后每次拿着路径端点和lca加一加减一减就行了
#include<bits/stdc++.h>
#define pa pair<int,int>
#define ll long long
using namespace std;
const int maxn=; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int N,M,L=;
int eg[maxn*][],egh[maxn],ect;
int dep[maxn],fa[maxn],v[maxn];
int qu[maxn*][],qh[maxn],op[maxn][];
ll tr[maxn];
bool flag[maxn]; inline int lowbit(int x){return x&(-x);}
inline int getfa(int x){return x==fa[x]?x:fa[x]=getfa(fa[x]);}
inline void adeg(int a,int b){
eg[++ect][]=b;eg[ect][]=egh[a];egh[a]=ect;
}inline void adq(int a,int b,int i){
qu[i][]=b;qu[i][]=qh[a];qh[a]=i;
} inline void add(int x,int y){
for(;x&&x<=L;x+=lowbit(x)) tr[x]+=y;
}
inline ll query(int x){
ll re=;for(;x;x-=lowbit(x)) re+=tr[x];return re;
} void tarjan(int x){
flag[x]=;
for(int i=egh[x];i!=-;i=eg[i][]){
if(flag[eg[i][]]) continue;
dep[eg[i][]]=dep[x]+;L=max(L,dep[x]+);
tarjan(eg[i][]);fa[getfa(eg[i][])]=getfa(x);
}
for(int i=qh[x];i!=-;i=qu[i][]){
if(flag[qu[i][]]) op[i>>][]=getfa(qu[i][]);
}
} int main(){
int i,j,k;
N=rd(),M=rd();
memset(egh,-,sizeof(egh));memset(qh,-,sizeof(qh));
for(i=;i<=N;i++) v[i]=rd();
for(i=;i<N;i++){
int a=rd(),b=rd();
adeg(a,b);adeg(b,a);
}for(i=;i<=M;i++){
int a=rd(),b=rd();
if(a==){
int c=rd();adq(b,c,i<<);adq(c,b,i<<|);
op[i][]=b,op[i][]=c;
}else op[i][]=b;
}for(i=;i<=N;i++) fa[i]=i;
dep[]=;tarjan();//printf("ll");
for(i=;i<=N;i++){
add(dep[i],v[i]);add(dep[i]+,-v[i]);
}
for(i=;i<=M;i++){
if(op[i][]){
add(dep[op[i][]],);add(dep[op[i][]]+,-);
if(op[i][]!=op[i][]) add(dep[op[i][]]+,),add(dep[op[i][]]+,-);
if(op[i][]!=op[i][]) add(dep[op[i][]]+,),add(dep[op[i][]]+,-);
}else{
if(op[i][]>L) printf("0\n");
else printf("%lld\n",query(op[i][]));
}
} return ;
}
suoi08 一收一行破 (tarjanLca+树状数组)的更多相关文章
- 【树状数组】【P2345】 奶牛集会
传送门 Description 约翰的\(N\)头奶牛每年都会参加"哞哞大会".哞哞大会是奶牛界的盛事.集会上的活动很多,比如堆干草,跨栅栏,摸牛仔的屁股等等.它们参加活动时会聚在 ...
- 【P1972】HH的项链——树状数组+询问离线
(题面摘自luogu) 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集 ...
- BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2221 Solved: 1179[Submit][Sta ...
- BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1399 Solved: 694[Submit][Status] ...
- 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序
3881: [Coci2015]Divljak Time Limit: 20 Sec Memory Limit: 768 MBSubmit: 508 Solved: 158[Submit][Sta ...
- 【BZOJ-1103】大都市meg 树状数组 + DFS序
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2009 Solved: 1056[Submit][Sta ...
- 【BZOJ-4548&3658】小奇的糖果&Jabberwocky 双向链表 + 树状数组
4548: 小奇的糖果 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 103 Solved: 47[Submit][Status][Discuss] ...
- HD1556Color the ball(树状数组)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- nyoj116_士兵杀敌(二)_树状数组
士兵杀敌(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军经常 ...
随机推荐
- python语言程序设计7
1, 特么的打个空格出现就出现个点是个怎么回事, 昨天虽然是我复制的代码,,但也是我一点一点写出来的啊.. 复制的时候缩进直接就没了.我去 但是我感觉它一开始给我讲的一些基础理论又有点忘了,我希望你能 ...
- 2019年以后ArcGIS 调用天地图的资源URL
2019年1月1日起,天地图做出如下变更,导致直接在Arcgis/ArcMap中添加WMTS服务不能用了. 国家天地图解释的很清楚,注册个人用户就可以了. 原有调用方式不变,只要在URL 后添加“&a ...
- “数学口袋精灵”App的第三个Sprint计划----开发日记(第一天12.7~第十天12.16)
“数学口袋精灵”第三个Sprint计划----第一天 项目进度: 基本完成一个小游戏,游戏具有:随机产生算式,判断对错功能.通过轻快的背景音乐,音效,给玩家提供一个良好的氛围. 任务分配: 冯美欣: ...
- 异常 try – finally 注意的地方
finally 异常机制中还有一个重要的部分,就是finally, catch后面可以跟finally语句,语法如下所示: try{ //可能抛出异常 }catch(Exception e){ / ...
- git 使用ssh密钥
一.查看仓库支持的传输协议 1.1查看仓库支持的传输协议 使用命令 git remote -v 查看你当前的 remote url root@zengyue:/home/yuanGit# git re ...
- spring mvc的工作原理
该文转载自:http://blog.csdn.net/u012191627/article/details/41943393 SpringMVC框架介绍 1) spring MVC属于SpringFr ...
- CI框架在辅助函数中使用配置文件中的变量
问题: 现有一个自定义的辅助函数,想要获取配置文件中的配置项(配置文件路径为application/config/config.php) 分析: 辅助函数并不是定义在一个class中,而是很多个可供外 ...
- 编写一个shell脚本来编译并运行java代码
概述 编译和运行java分别要用到javac命令和java命令,虽然可以使用IDE(比如eclipse,InteliJ,NetBean...),按一下快捷键就可以实现编译并运行,但是,在之前还要配置一 ...
- Linux下安装oracle的过程
1. Linux 安装 主要不要将home分区设置的特别大 2. 安装必须的一些包. yum install -y \ binutils.x86_64 \ elfutils-libelf-devel. ...
- CSS 范围选择器(自编)
选择第一个到第六个li元素ul li:nth-child(n+3):not(:nth-child(n+6)){} 选择第二个到最后一个ul li:nth-child(2)~li{} 选择除了第一个和最 ...