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\) 对于 ...
随机推荐
- java练习 - 字符串反转
思路: 1. 首先将字符串转换成数组,一个数组元素放一个字符. 2. 循环遍历字符串,将所有字符串前后字符调换位置,比如:第一个和最后一个调换,第二个和倒数第三调换,第三个和倒数第三调换,直到所有字符 ...
- linux开发
linux开发资料 01 02 03 04 05 06 07 08 09 10 11 1 2 3 4 5 21 22 23 24 25
- ajaxUploadFile在IE9等IE浏览器,上传变json下载的问题解决(SpringMVC + ajaxUploadFile)
使用ajaxUploadFIle进行文件上传,在google中正常,但是IE中却变成了json文件下载.经过搜索和尝试,解决方案如下: 首先明确,该功能使用$.ajaxFileUpload而非ajax ...
- 换行符在ajax中返回json,eval时发生的 Unexpected token ILLEGAL
用户如果输入了换行在数据中记录为‘空格’,但不是真正的空格. 程序前台采用ajax和json返回数据绑定时会 出现 Unexpected token ILLEGAL 例子: 在sql中存储为下图 在“ ...
- JS跨域访问问题
js跨域了. 只能给几个资料参考了:http://blog.csdn.net/lovingprince/article/details/2954675 http://www.kuqin.com/web ...
- linux中找不到/etc/sysconfig/iptables
解决办法初始化iptables. #iptables -F #service iptables save #service iptables restart
- 一些Wifi破解姿势
wlan0:无线网卡设备 BSSID/AP's MAC:目标路由器的mac地址 Client's MAC:连接到此wifi客户端的mac地址 ESSID:这个无线的名字 大致思路: 获取bssid和e ...
- spring ,mybatis多数据源
同一个项目有时会涉及到多个数据库,也就是多数据源.多数据源又可以分为两种情况: 1)两个或多个数据库没有相关性,各自独立,其实这种可以作为两个项目来开发.比如在游戏开发中一个数据库是平台数据库,其 ...
- JuneX_13
在积分制的压力下,基本上能打的比赛都打了(除了忘了的).打了这么多比赛(其实也不多),发现有相当一部分题目考察的还是挺基础的内容,像搜索,DP,树,图,然而做的并不好.要么直接不会敲,要么调试大半天, ...
- hdu_5968_异或密码(预处理+二分)
题目链接:hdu_5968_异或密码 题意: 中午,不解释 题解: 前缀处理一下异或值,然后上个二分查找就行了,注意是unsigned long long #include<bits/stdc+ ...