bzoj 1036 树的统计Count
题意:...
解法:树链剖分,对点进行重编号,这样的话线段树中点的信息就是树中点的信息。。。别的很常规。。。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define N 30010 5 #define lson l,m,n<<1 6 #define rson m+1,r,n<<1|1 7 using namespace std; 8 const int inf=1<<30; 9 struct Edge{ 10 int u,v,next; 11 Edge(){} 12 Edge(int _u,int _v,int _next){ 13 u=_u;v=_v;next=_next; 14 } 15 }edge[N<<1]; 16 int head[N],cnt; 17 int sz[N],top[N],fa[N],dep[N],hash[N],w[N],son[N],num; 18 void init(){ 19 memset(head,-1,sizeof(head)); 20 cnt=num=0; 21 } 22 void add(int u,int v){ 23 edge[cnt]=Edge(u,v,head[u]);head[u]=cnt++; 24 edge[cnt]=Edge(v,u,head[v]);head[v]=cnt++; 25 } 26 void dfs(int u,int d){ 27 sz[u]=1;son[u]=0;dep[u]=d; 28 for(int k=head[u];k!=-1;k=edge[k].next){ 29 int v=edge[k].v; 30 if(v==fa[u])continue; 31 fa[v]=u; 32 dfs(v,d+1); 33 sz[u]+=sz[v]; 34 if(sz[v]>sz[son[u]])son[u]=v; 35 } 36 } 37 void build_tree(int u,int pre){ 38 hash[u]=++num;top[u]=pre; 39 if(son[u])build_tree(son[u],pre); 40 for(int k=head[u];k!=-1;k=edge[k].next){ 41 int v=edge[k].v; 42 if(v!=fa[u]&&v!=son[u])build_tree(v,v); 43 } 44 } 45 struct segtree{ 46 int maxn[N<<2],sum[N<<2]; 47 void pushup(int n){ 48 sum[n]=sum[n<<1]+sum[n<<1|1]; 49 maxn[n]=max(maxn[n<<1],maxn[n<<1|1]); 50 } 51 void update(int nn,int x,int l,int r,int n){ 52 if(l==r){ 53 maxn[n]=sum[n]=x; 54 return; 55 } 56 int m=(l+r)>>1; 57 if(nn<=m)update(nn,x,lson); 58 else update(nn,x,rson); 59 pushup(n); 60 } 61 int query_max(int ll,int rr,int l,int r,int n){ 62 if(ll==l&&rr==r)return maxn[n]; 63 int m=(l+r)>>1; 64 if(rr<=m)return query_max(ll,rr,lson); 65 else if(ll>m)return query_max(ll,rr,rson); 66 else return max(query_max(ll,m,lson),query_max(m+1,rr,rson)); 67 } 68 int query_sum(int ll,int rr,int l,int r,int n){ 69 if(ll==l&&rr==r)return sum[n]; 70 int m=(l+r)>>1; 71 if(rr<=m)return query_sum(ll,rr,lson); 72 else if(ll>m)return query_sum(ll,rr,rson); 73 else return query_sum(ll,m,lson)+query_sum(m+1,rr,rson); 74 } 75 }seg; 76 int Query_max(int a,int b,int n){ 77 int ta=top[a],tb=top[b],ans=-inf; 78 while(ta!=tb){ 79 if(dep[ta]<dep[tb]){ 80 swap(ta,tb);swap(a,b); 81 } 82 ans=max(ans,seg.query_max(hash[ta],hash[a],1,n,1)); 83 a=fa[ta];ta=top[a]; 84 } 85 if(dep[a]>dep[b])swap(a,b); 86 return max(ans,seg.query_max(hash[a],hash[b],1,n,1)); 87 } 88 int Query_sum(int a,int b,int n){ 89 int ta=top[a],tb=top[b],ans=0; 90 while(ta!=tb){ 91 if(dep[ta]<dep[tb]){ 92 swap(ta,tb);swap(a,b); 93 } 94 ans+=seg.query_sum(hash[ta],hash[a],1,n,1); 95 a=fa[ta];ta=top[a]; 96 } 97 if(dep[a]>dep[b])swap(a,b); 98 return ans+seg.query_sum(hash[a],hash[b],1,n,1); 99 } 100 int main(){ 101 int n,a,b,q; 102 char op[10]; 103 while(~scanf("%d",&n)){ 104 init(); 105 for(int i=1;i<n;i++){ 106 scanf("%d%d",&a,&b); 107 add(a,b); 108 } 109 for(int i=1;i<=n;i++)scanf("%d",&w[i]); 110 dfs(1,1); 111 build_tree(1,1); 112 for(int i=1;i<=n;i++)seg.update(hash[i],w[i],1,n,1); 113 scanf("%d",&q); 114 while(q--){ 115 scanf("%s%d%d",op,&a,&b); 116 if(strcmp(op,"QMAX")==0){ 117 int ans=Query_max(a,b,n); 118 printf("%d\n",ans); 119 }else if(strcmp(op,"QSUM")==0){ 120 int ans=Query_sum(a,b,n); 121 printf("%d\n",ans); 122 }else { 123 seg.update(hash[a],b,1,n,1); 124 } 125 } 126 } 127 return 0; 128 }
转载于:https://www.cnblogs.com/silver-bullet/archive/2013/02/09/2909473.html
bzoj 1036 树的统计Count相关推荐
- 树链剖分入门+HYSBZ - 1036树的统计Count
今天学习了树链剖分,记录一下. [题目背景] HYSBZ - 1036树的统计Count [题目分析] 题目要求求任意结点之间路径的和以及路径上最大的结点,还有可能修改.如果正常做可能会很复杂(我也不 ...
- Codevs 2460 == BZOJ 1036 树的统计
2460 树的统计 2008年省队选拔赛浙江 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 一棵树上有n个节点,编号分别为1 ...
- BZOJ 1036: [ZJOI2008]树的统计Count
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3427 Solved: 1429 [Submi ...
- 树链剖分(bzoj 1036: [ZJOI2008]树的统计Count)
树链剖分: 把一棵树剖分为若干条链,然后利用数据结构(树状数组,SBT,Splay,线段树等等)去维护每一条链,复杂度 为O(logn),总体复杂度O(nlog²n) 步骤: ①将树的边分成重边和轻边 ...
- [ZJOI2008][BZOJ1036] 树的统计count
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MB Submit: 7980 Solved: 3266 [Submi ...
- 【BZOJ 1036】[ZJOI2008]树的统计Count
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1036 [题意] [题解] 树链剖分入门题; 每一条链维护一个线段树就好; uppest ...
- BZOJ 1036 [ZJOI2008]树的统计Count
以前动态树写过这个题,今天尝试树链剖分解决~ 模板题,就声明一点,线段树维护的是点权 View Code 1 #include <iostream> 2 #include <cstd ...
- 树链剖分 - BZOJ 1036: [ZJOI2008]树的统计Count
这是树链剖分的入门题,也是我学树链剖分的第一题. 树链剖分:就是把树中和线段树联系起来,求(u,v)路径中权值的最大值和其路径的权值和. 入门blog:http://blog.sina.com.cn/ ...
- 【BZOJ 1036】 树的统计count
题目 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: ...
最新文章
- ROSE 好的参考资料 http://topic.csdn.net/t/20020716/14/878323.html
- python 给定URL 如何获取其内容,并将其保存至HTML文档。
- protoc文件生成cs文件
- 简明python教程 --C++程序员的视角(八):标准库
- Vue实现访问百度音乐API实现播放音乐功能
- linux下找不到libc 库,Linux-覆盖libc open()库函数
- Android 驱动(3)---Android驱动开发知识储备
- GhostNet 解读及代码实验(附代码、超参、日志和预训练模型)
- windows10 右键 manage 没反应
- Java课程设计——学生信息系统(团队)
- win10 如何设置绿色保护色?
- scheme 语言概述
- 田口设计(正交设计)——参数设置方法
- 立创开源|太阳能逐日系统
- 制作拨号服务器,如何打造全自动的拨号上网服务器
- mac uvc相机_Mac相机无法正常工作? 这是解决方法
- 第七章第二十三题(游戏:储物柜难题)(Game: locker problem)
- 分子动力学模拟Gromacs一般使用步骤(空蛋白)
- 不只Keep、FITURE、乐刻,运动健身赛道近5年吸金633亿早已起飞
- 歌曲转调之后和弦如何转换