【树链剖分】【dfs序】【线段树】bzoj2836 魔法树
这道题告诉我们:树链剖分的重标号就是dfs序。
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 100001
#define lson rt<<1,l,m
#define rson rt<<1|1,m+1,r
typedef long long ll;
ll delta[N<<2],sumv[N<<2];
int n,m;
int en,v[N],first[N],next[N];
void AddEdge(const int &U,const int &V)
{
v[++en]=V;
next[en]=first[U];
first[U]=en;
}
int dep[N],fa[N],siz[N],son[N],tot,Ls[N],top[N],Rs[N];
void dfs(int U)
{
siz[U]=1;
for(int i=first[U];i;i=next[i])
{
fa[v[i]]=U;
dep[v[i]]=dep[U]+1;
dfs(v[i]);
siz[U]+=siz[v[i]];
if(siz[son[U]]<siz[v[i]])
son[U]=v[i];
}
}
void dfs2(int U)
{
Ls[U]=++tot;
if(son[U])
{
top[son[U]]=top[U];
dfs2(son[U]);
}
for(int i=first[U];i;i=next[i])
if(v[i]!=son[U])
{
top[v[i]]=v[i];
dfs2(v[i]);
}
Rs[U]=tot;
}
void pushdown(int rt,int size)
{
if(delta[rt])
{
delta[rt<<1]+=delta[rt];
delta[rt<<1|1]+=delta[rt];
sumv[rt<<1]+=delta[rt]*(ll)(size-(size>>1));
sumv[rt<<1|1]+=delta[rt]*(ll)(size>>1);
delta[rt]=0;
}
}
void update(int ql,int qr,int v,int rt,int l,int r)
{
if(ql<=l&&r<=qr)
{
delta[rt]+=(ll)v;
sumv[rt]+=((ll)(r-l+1)*(ll)v);
return;
}
pushdown(rt,r-l+1);
int m=(l+r>>1);
if(ql<=m) update(ql,qr,v,lson);
if(m<qr) update(ql,qr,v,rson);
sumv[rt]=sumv[rt<<1]+sumv[rt<<1|1];
}
ll query(int ql,int qr,int rt,int l,int r)
{
if(ql<=l&&r<=qr) return sumv[rt];
pushdown(rt,r-l+1);
int m=(l+r>>1); ll res=0;
if(ql<=m) res+=query(ql,qr,lson);
if(m<qr) res+=query(ql,qr,rson);
return res;
}
void Update(int U,int V,int W)
{
int f1=top[U],f2=top[V];
while(f1!=f2)
{
if(dep[f1]<dep[f2])
{
swap(U,V);
swap(f1,f2);
}
update(Ls[f1],Ls[U],W,1,1,n);
U=fa[f1];
f1=top[U];
}
if(dep[U]>dep[V])
swap(U,V);
update(Ls[U],Ls[V],W,1,1,n);
}
int main()
{
int A,B,C; char op[2];
scanf("%d",&n);
for(int i=1;i<n;++i)
{
scanf("%d%d",&A,&B);
AddEdge(A+1,B+1);
}
top[1]=1;
dfs(1);
dfs2(1);
scanf("%d",&m);
for(;m;--m)
{
scanf("%s%d",op,&A);
if(op[0]=='A')
{
scanf("%d%d",&B,&C);
Update(A+1,B+1,C);
}
else
printf("%lld\n",query(Ls[A+1],Rs[A+1],1,1,n));
}
return 0;
}
【树链剖分】【dfs序】【线段树】bzoj2836 魔法树的更多相关文章
- BZOJ_4034 [HAOI2015]树上操作 【树链剖分dfs序+线段树】
		
一 题目 [HAOI2015]树上操作 二 分析 树链剖分的题,这里主要用到了$dfs$序,这题比较简单的就是不用求$lca$. 1.和树链剖分一样,先用邻接链表建双向图. 2.跑两遍$dfs$,其实 ...
 - BZOJ - 4196 软件包管理器 (树链剖分+dfs序+线段树)
		
题目链接 设白色结点为未安装的软件,黑色结点为已安装的软件,则: 安装软件i:输出结点i到根的路径上的白色结点的数量,并把结点i到根的路径染成黑色.复杂度$O(nlog^2n)$ 卸载软件i:输出结点 ...
 - BZOJ 2286 树链剖分+DFS序+虚树+树形DP
		
第一次学习虚树,就是把无关的点去掉.S里维护一条链即可. #include <iostream> #include <cstring> #include <cstdio& ...
 - BZOJ4012[HNOI2015]开店——树链剖分+可持久化线段树/动态点分治+vector
		
题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现她们面临着一个 ...
 - BZOJ 2243:染色(树链剖分+区间合并线段树)
		
[SDOI2011]染色Description给定一棵有n个节点的无根树和m个操作,操作有2类:1.将节点a到节点b路径上所有点都染成颜色c:2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认 ...
 - BZOJ 2243: [SDOI2011]染色 树链剖分 倍增lca 线段树
		
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
 - [BZOJ - 2819] Nim 【树链剖分 / DFS序】
		
题目链接: BZOJ - 2819 题目分析 我们知道,单纯的 Nim 的必胜状态是,各堆石子的数量异或和不为 0 .那么这道题其实就是要求求出树上的两点之间的路径的异或和.要求支持单点修改. 方法一 ...
 - 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树
		
题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...
 - POJ 2763 Housewife Wind 【树链剖分】+【线段树】
		
<题目链接> 题目大意: 给定一棵无向树,这棵树的有边权,这棵树的边的序号完全由输入边的序号决定.给你一个人的起点,进行两次操作: 一:该人从起点走到指定点,问你这段路径的边权总和是多少. ...
 - 树链剖分&dfs序
		
树上问题 很多处理区间的问题(像是RMQ,区间修改).可以用线段树,树状数组,ST表这些数据结构来维护.但是如果将这些问题挪到了树上,就不能直接用这些数据结构来处理了.这时就用到了dfs序和树链剖分. ...
 
随机推荐
- POJ3020:Antenna Placement(二分图匹配)
			
Antnna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11093 Accepted: 5459 ...
 - ng的ngModel用来处理表单操作
			
https://segmentfault.com/a/1190000009126012
 - 使用http_load网站压力测试
			
http_load用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工具, 它可以以一个单一的进程运行,一般不会把客户机搞死.它可以自定义测试的URL列表 下载:http://acme.c ...
 - powercmd注册码
			
推荐一个很方便的软件:powercmd 用户名:nzone 注册码:PCMDA-86128-PCMDA-70594 . 下载地址网上很多: http://soft.hao123.com/soft/a ...
 - [POJ1423]Stirling公式的应用
			
Stirling公式: n!约等于sqrt(2*pi*n)*(n/e)^n 另外,e约等于2.71828182845409523... 试了一下发现math库里面并不能像pi一样直接调e但是发现挺好记 ...
 - hdu 2016 数据的交换输出
			
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2016 题目大意:把最小的和第一个交换并输出.注意格式哦! #include <stdio.h&g ...
 - LeetCode the longest palindrome substring
			
回文检测,参考http://blog.csdn.net/feliciafay/article/details/16984031 使用时间复杂度和空间复杂度相对较低的动态规划法来检测,具体的做法 图一 ...
 - Python3安装cx_Oracle连接oracle数据库实操总结
			
弄清版本,最重要!!! 首先安装配置时,必须把握一个点,就是版本一致!包括:系统版本,python版本,oracle客户端的版本,cx_Oracle的版本,然后安装配置就容易了! 如果已经安装Pyth ...
 - AOP相关
			
静态代理.动态代理与AOP: 简单易懂:http://blog.csdn.net/hejingyuan6/article/details/36203505 补充:http://layznet.itey ...
 - 程序员面试宝典 笔记(第六章 预处理 const 和sizeof())
			
void main() { "; cout<< cout<< "; cout<< cout<<strlen(ss2)<< ...