suoi22 WRX知识树(dfs序)
把一条路径拆成到根的四个链(两端点、lca和fa[lca]),然后给dfs序中链的端点做单点修改、区间查询它的子树和再加上它原来的权值就可以了
#include<bits/stdc++.h>
#define pa pair<int,int>
#define lowb(x) ((x)&(-(x)))
#define REP(i,n0,n) for(i=n0;i<=n;i++)
#define PER(i,n0,n) for(i=n;i>=n0;i--)
#define MAX(a,b) ((a>b)?a:b)
#define MIN(a,b) ((a<b)?a:b)
#define CLR(a,x) memset(a,x,sizeof(a))
#define rei register int
using namespace std;
typedef long long ll;
const int maxn=1e6+; 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;
int eg[maxn*][],egh[maxn],ect;
int v[maxn],fa[maxn],bfa[maxn];
int lq[maxn*][],lqh[maxn],lca[maxn][];
int dfn[maxn][],tot;
int stk[maxn][],sh;
ll tr[maxn];
int que[maxn];
bool vis[maxn]; inline void adeg(int a,int b){
eg[++ect][]=b;eg[ect][]=egh[a];egh[a]=ect;
} int getf(int x){return x==bfa[x]?x:bfa[x]=getf(bfa[x]);} inline void add(int x,ll y){
for(;x>&&x<=N;x+=lowb(x)) tr[x]+=y;
}
inline ll query(int x){
ll re=;for(;x>;x-=lowb(x)) re+=tr[x];return re;
} void dfs(){
stk[sh=][]=;stk[][]=egh[];
dfn[][]=tot=;
while(sh){
int x=stk[sh][],i=stk[sh][],b=eg[i][];
vis[x]=;
if(!i){
for(int j=lqh[x];j;j=lq[j][]){
int c=lq[j][];
if(vis[c]) lca[j>>][]=getf(c);
}
bfa[getf(x)]=fa[x];
dfn[x][]=tot;
sh--;continue;
}
stk[sh][]=eg[i][];
if(!vis[b]){
fa[b]=x;stk[++sh][]=b,stk[sh][]=egh[b];
dfn[b][]=++tot;
} }
} int main(){
//freopen(".in","r",stdin);
rei i;
N=rd(),M=rd();
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<=N;i++) bfa[i]=i;
for(i=;i<=M;i++){
int a=rd(),b=rd();
if(!a){
que[i]=b;
}else{
int c=rd(),d=rd();
lca[i][]=d;
lq[i<<][]=b;lq[i<<][]=lqh[c];lqh[c]=i<<;
lq[i<<|][]=c;lq[i<<|][]=lqh[b];lqh[b]=i<<|;
}
}
dfs();
for(i=;i<=M;i++){
if(lca[i][]){
// printf("!%d %d %d\n",lca[i][0],lq[i<<1][0],lq[i<<1|1][0]);
add(dfn[lca[i][]][],-lca[i][]);
if(fa[lca[i][]]) add(dfn[fa[lca[i][]]][],-lca[i][]);
add(dfn[lq[i<<][]][],lca[i][]);
add(dfn[lq[i<<|][]][],lca[i][]);
// cout<<"mmm"<<endl;
}else{
printf("%lld\n",v[que[i]]+query(dfn[que[i]][])-query(dfn[que[i]][]-));
} }
return ;
}
suoi22 WRX知识树(dfs序)的更多相关文章
- Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序
题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s 内存限制:512.0MB 总提交次数:196 AC次数:65 平均分: ...
- 51 nod 1681 公共祖先 (主席树+dfs序)
1681 公共祖先 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个庞大的家族,共n人.已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边). 在另 ...
- BZOJ_3252_攻略_线段树+dfs序
BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...
- 【XSY2534】【BZOJ4817】树点涂色 LCT 倍增 线段树 dfs序
题目大意 Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜 ...
- 【BZOJ】3991: [SDOI2015]寻宝游戏 虚树+DFS序+set
[题意]给定n个点的带边权树,对于树上存在的若干特殊点,要求任选一个点开始将所有特殊点走遍后返回.现在初始没有特殊点,m次操作每次增加或减少一个特殊点,求每次操作后的总代价.n,m<=10^5. ...
- 【bzoj4817】树点涂色 LCT+线段树+dfs序
Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...
- 【BZOJ1803】Spoj1487 Query on a tree III 主席树+DFS序
[BZOJ1803]Spoj1487 Query on a tree III Description You are given a node-labeled rooted tree with n n ...
- S - Query on a tree HDU - 3804 线段树+dfs序
S - Query on a tree HDU - 3804 离散化+权值线段树 题目大意:给你一棵树,让你求这棵树上询问的点到根节点直接最大小于等于val的长度. 这个题目和之前写的那个给你一棵 ...
- K. Random Numbers(Gym 101466K + 线段树 + dfs序 + 快速幂 + 唯一分解)
题目链接:http://codeforces.com/gym/101466/problem/K 题目: 题意: 给你一棵有n个节点的树,根节点始终为0,有两种操作: 1.RAND:查询以u为根节点的子 ...
随机推荐
- 2017-2018-4 20155317《网络对抗技术》EXP3 免杀原理与实践
2017-2018-4 20155317<网络对抗技术>EXP3 免杀原理与实践 一.问题回答 (1)杀软是如何检测出恶意代码的?杀软是通过代码特征比对得出的,将检查的代码和自己的特征库的 ...
- 20155318 《网络攻防》 Exp9 Web基础
20155318 <网络攻防> Exp9 Web基础 基础问题 SQL注入攻击原理,如何防御 就是通过把SQL命令插入到"Web表单递交"或"输入域名&quo ...
- 20155328 网络攻防 实验五:MSF基础应用
20155328 网络攻防 实验五:MSF基础应用 实践内容及过程记录 一.Windows服务渗透攻击----ms08_067 攻击机:kali 靶机:WindowsXP(英文版) 第一步,分别查看攻 ...
- POJ 3278&&2049&&3083
这次的题目叫图的深度&&广度优先遍历. 然后等我做完了题发现这是DFS&&BFS爆搜专题. 3278:题目是经典的FJ,他要抓奶牛.他和牛(只有一头)在一条数轴上,他们 ...
- 汇编 MOV -2
知识点: MOV指令 基址 内联汇编 把OD附加到资源管理器右键菜单 一.MOV指令 aaa=0x889977;//MOV DWORD PTR DS:[0x403018],0x8899 ...
- 取两张mysql表中分别两个字段相同的值
看起来有点绕口吧,举个例子吧,如图 两张表,字段名也不同字段gs 和另一张表 gsmc 的有些值是相同的 我们要做的就是把这个相同的值找出来 会写这个sql语句就可以 只写重点 $sql2 = &q ...
- 轻量级直播服务器SRS安装及编译
最近由于公司开发的需要--互动会议,开始研究直播中的技术.由于自身没有接触过虚拟机导致在研究的过程中遇到了很大的问题,首先官方GitHub给出的文档并没有清晰的指出编译是需要通过何种方式进行编译?以下 ...
- Express模版引擎hbs备忘
最近几天折腾了下express,想找个合适的模版引擎,下面是一些折腾过程的备忘 选择标准 选择一门模版语言时,可能会考虑的几点 语法友好(micro tmpl那种语法真是够了) 支持模版嵌套(子模版的 ...
- cloudflare 加https、加SSL(加CF处理)实操流程
建站过程中,少不了SSL证书等cf添加操作,cf,即cloudflare的简写 首先,点击如图“Add site”,弹出输入框后,填写已在如阿里云.goDaddy.freedom等域名平台购买的域名: ...
- Vue.js 相关知识(脚手架)
1. vue-cli 简介 Vue-cli 是 vue的设计者,为提升开发效率而提供的一个脚手架工具,可通过vue-cli快速构造项目结构 2. vue-cli 安装步骤 安装npm 或 cnpm n ...