题目连接: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(树剖)的更多相关文章

  1. 【61测试】【dp】【二分】【前缀和】【树剖】

    不要问我为什么昨天考的今天才贴解题报告.. 第一题: 给定3个字符串,求它们的最长公共子序列. 解: 考试时知道肯定是LCS的二维再加一维,用三维,可天堂有路你不走,地狱无门你偏来...灵机一动想出来 ...

  2. 【树链剖分】洛谷P3384树剖模板

    题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...

  3. 【BZOJ 3626】 [LNOI2014]LCA【在线+主席树+树剖】

    题目链接: TP 题解:   可能是我比较纱布,看不懂题解,只好自己想了…… 先附一个离线版本题解[Ivan] 我们考虑对于询问区间是可以差分的,然而这并没有什么卵用,然后考虑怎么统计答案. 首先LC ...

  4. BZOJ_2238_Mst_树剖+线段树

    BZOJ_2238_Mst_树剖+线段树 Description 给出一个N个点M条边的无向带权图,以及Q个询问,每次询问在图中删掉一条边后图的最小生成树.(各询问间独立,每次询问不对之后的询问产生影 ...

  5. BZOJ_3626_[LNOI2014]LCA_离线+树剖

    BZOJ_3626_[LNOI2014]LCA_离线+树剖 题意: 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1. 设dep[i]表示点i的深度, ...

  6. BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树

    BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树 题意: 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastan ...

  7. BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树

    BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为 ...

  8. BZOJ_2157_旅游_树剖+线段树

    BZOJ_2157_旅游_树剖+线段树 Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但 ...

  9. [GXOI/GZOI2019]旧词(树上差分+树剖)

    前置芝士:[LNOI2014]LCA 要是这题放HNOI就好了 原题:\(\sum_{l≤i≤r}dep[LCA(i,z)]\) 这题:\(\sum_{i≤r}dep[LCA(i,z)]^k\) 对于 ...

随机推荐

  1. 重读The C programming Lanuage 笔记四:c预处理

    C预处理器执行宏替换.条件编译以及包含指定的文件.以#开头的命令行就是与处理器的对象.这些命令行的语法独立于语言的其他部分,它们可以出现在任何地方,其作用可延续到所在编译单元的末尾(与作用域无关).行 ...

  2. Winform 无边框窗口移动自定义边框粗细颜色

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. [转] Android root 原理

    欢迎转载,转载请注明出处:http://www.cnblogs.com/lanrenxinxin/p/5572640.html 0x00 关于root linux和类Unix系统的最初设计都是针对多用 ...

  4. C#键盘事件处理

    键盘事件是在用户按下键盘上的一个键的时候发生的,可分为两类.第一类是KeyPress事件,当按下的键表示的是一个ASCII字符的时候就会触发这类事件,可通过他的KeyPressEventArgs类型参 ...

  5. 2016 SyScan360 国际前瞻信息安全会议 多角度探讨信息安全

    SyScan360国际前瞻信息安全会议由与中国第一大互联网安全公司-360公司与SyScan前瞻信息安全技术年会(TheSymposiumonSecurityforAsiaNetwork,以下简称Sy ...

  6. 2016 C++及系统软件技术大会亮点

    2016 C++及系统软件技术大会将于201610月28日-29日在上海举办!此次2016 C++及系统软件技术大会秉承"全球专家. 连接智慧"的理念!大会特邀C++之父Bjarn ...

  7. java 读取excel文件(只读取xls文件)

    package com.sun.test; import java.io.BufferedInputStream;import java.io.File;import java.io.FileInpu ...

  8. json格式数据 ,将数据库中查询的结果转换为json(方式2)

    controller: /*** * 返回所有版本的信息,json的形式返回到前台 * @return */ @RequestMapping(value="/getAllVersion&qu ...

  9. 单尺度二维离散小波分解dwt2

    clc,clear all,close all; load woman; [cA,cH,cV,cD]=dwt2(X,'haar');%单尺度二维离散小波分解.分解小波函数haar figure,ims ...

  10. vs2013+opencv2.4.11+Qt5.5.1配置

    注意本教程配置环境:win7 32位 如果只配置vs2013+opencv2.4.11,参考http://jingyan.baidu.com/article/ff411625b1311a12e4823 ...