hdu_5221_Occupation(树剖)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5221
题意:给你一棵树,每个节点有一定的值,有三种操作: 1 x y 表示占领树上x-y的所有节点,2 x 表示去掉这点,3 x表示占领以这个节点为根的所有节点
题解:1 2 都是树剖操作,3则要记录树剖的时间戳,一个根节点下的点的新编号都是连续的,所以只要记录该根节点的最大时间戳就知道这个区间了
#include<cstdio>
#pragma comment(linker, "/STACK:102400000,102400000")
#define F(i,a,b) for(int i=a;i<=b;i++)
#define root 1,n,1
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1 const int N=1e5+;
int dep[N],sz[N],hs[N],top[N],tid[N],fid[N],fa[N],idx,mp[N];
int t,n,m,pp,x,y,a[N],sum[N*],vis[*N],ans[N*],g[N],nxt[*N],v[*N],ed; inline int max(int a,int b){return a>b?a:b;}
inline void adg(int x,int y){v[++ed]=y,nxt[ed]=g[x],g[x]=ed;}
//线段树
void build(int l,int r,int rt){
vis[rt]=ans[rt]=;
if(l==r){sum[rt]=a[fid[l]];return;}
int m=(l+r)>>;
build(ls),build(rs);
sum[rt]=sum[rt<<]+sum[rt<<|];
} inline void pd(int rt){
if(vis[rt])
vis[rt<<]=vis[rt<<|]=,ans[rt<<]=sum[rt<<],ans[rt<<|]=sum[rt<<|],vis[rt]=;
}
void update(int L,int R,int op,int l,int r,int rt){
if(L<=l&&r<=R){
vis[rt]=op,ans[rt]=op?sum[rt]:;
return;
}
pd(rt);
int m=(l+r)>>;
if(L<=m)update(L,R,op,ls);
if(R>m)update(L,R,op,rs);
ans[rt]=ans[rt<<]+ans[rt<<|];
}
//树剖
void dfs1(int u,int pre){
dep[u]=dep[pre]+,hs[u]=,fa[u]=pre,sz[u]=;
for(int i=g[u];i;i=nxt[i])if(v[i]!=pre)
dfs1(v[i],u),sz[u]+=sz[v[i]],hs[u]=(sz[v[i]]>sz[hs[u]])?v[i]:hs[u];
}
void dfs2(int u,int tp){
top[u]=tp,tid[u]=++idx,fid[idx]=u,mp[u]=idx;
if(hs[u])dfs2(hs[u],tp),mp[u]=max(mp[u],mp[hs[u]]);
for(int i=g[u];i;i=nxt[i])
if(v[i]!=fa[u]&&v[i]!=hs[u])dfs2(v[i],v[i]),mp[u]=max(mp[u],mp[v[i]]);
} void up(int x,int y){
int fx=top[x],fy=top[y];
while(fx!=fy){
if(dep[fx]>dep[fy])update(tid[fx],tid[x],,root),x=fa[fx],fx=top[x];
else update(tid[fy],tid[y],,root),y=fa[fy],fy=top[y];
}
if(dep[x]>dep[y])x^=y,y^=x,x^=y;
update(tid[x],tid[y],,root);
} int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
F(i,,n)scanf("%d",a+i);
F(i,,n)g[i]=;ed=;
F(i,,n-)scanf("%d%d",&x,&y),adg(x,y),adg(y,x);
dfs1(,),idx=,dfs2(,),build(root);
scanf("%d",&m);
F(i,,m){
scanf("%d",&pp);
if(pp==)scanf("%d%d",&x,&y),up(x,y);
else if(pp==)scanf("%d",&x),update(tid[x],tid[x],,root);
else scanf("%d",&x),update(tid[x],mp[x],,root);
printf("%d\n",ans[]);
}
}
return ;
}
hdu_5221_Occupation(树剖)的更多相关文章
- 【61测试】【dp】【二分】【前缀和】【树剖】
不要问我为什么昨天考的今天才贴解题报告.. 第一题: 给定3个字符串,求它们的最长公共子序列. 解: 考试时知道肯定是LCS的二维再加一维,用三维,可天堂有路你不走,地狱无门你偏来...灵机一动想出来 ...
- 【树链剖分】洛谷P3384树剖模板
题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...
- 【BZOJ 3626】 [LNOI2014]LCA【在线+主席树+树剖】
题目链接: TP 题解: 可能是我比较纱布,看不懂题解,只好自己想了…… 先附一个离线版本题解[Ivan] 我们考虑对于询问区间是可以差分的,然而这并没有什么卵用,然后考虑怎么统计答案. 首先LC ...
- BZOJ_2238_Mst_树剖+线段树
BZOJ_2238_Mst_树剖+线段树 Description 给出一个N个点M条边的无向带权图,以及Q个询问,每次询问在图中删掉一条边后图的最小生成树.(各询问间独立,每次询问不对之后的询问产生影 ...
- BZOJ_3626_[LNOI2014]LCA_离线+树剖
BZOJ_3626_[LNOI2014]LCA_离线+树剖 题意: 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1. 设dep[i]表示点i的深度, ...
- BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树
BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树 题意: 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastan ...
- BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树
BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为 ...
- BZOJ_2157_旅游_树剖+线段树
BZOJ_2157_旅游_树剖+线段树 Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但 ...
- [GXOI/GZOI2019]旧词(树上差分+树剖)
前置芝士:[LNOI2014]LCA 要是这题放HNOI就好了 原题:\(\sum_{l≤i≤r}dep[LCA(i,z)]\) 这题:\(\sum_{i≤r}dep[LCA(i,z)]^k\) 对于 ...
随机推荐
- Q & A
1 使用linux命令或者shell实现:文件words存放英文单词,格式为每行一个英文单词(单词可以重复),统计这个文件中出现次数最多的前10个单词. cat words.txt | sort | ...
- jq siblings()的强大之处
在事件处理的方法里 经常遇到自己做什么效果 其他节点就做反之效果 如果用判断 可处理 但代码太啰嗦不够简单 siblings()就可以解决这一切的麻烦 意思就是 除啦我之外的其他兄弟节点 这样可以做2 ...
- JAVA中方法的定义与使用(课堂学习归纳)
组合数,百度词条是这样解释的:从m个不同元素中取出n(n≤m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数(Combination) 对于计算组合数,需要一定的工作量,计算机可以很 ...
- Django开发环境配置
Eclipse 首先需要去Eclipse官网下载:http://www.eclipse.org/,Eclipse需要JDK支持,如果Eclipse无法正常运行,请到Java官网下载JDK安装:ht ...
- java之String类型
一:定义 String是复杂类型,是特殊的复杂类型. 二:创建 两种创建形式: String s = "abc"; String s = new String("abc& ...
- jqgrid参数
jqGrid参数 名称 类型 描述 默认值 可修改 url string 获取数据的地址 datatype string 从服务器端返回的数据类型,默认xml.可选类型:xml,local,json, ...
- python zipfile 文件压缩和文件
文件压缩 zipfile_obj = zipfile.ZipFile(zipfile_objpath, 'a', zipfile.ZIP_DEFLATED) for dirpath, dirnames ...
- SimpleDateFormat类
/* * DateFormat类概述 * DateFormat是日期时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间 * 是抽象类,所以使用其子类SimpleDateFormat * ...
- mysql解决中文乱码问题
安装文件 my.ini default-character-set=gbk 安装文件 db.opt default-character-set=gbkdefault-collation=gbk_chi ...
- POJ 2485 Highway(Prim+邻接矩阵)
( ̄▽ ̄)" //求最短总路径中的最大边长,Prim还需要一个Max变量 #include<iostream> #include<cstdio> #include&l ...