题意:...

解法:树链剖分,对点进行重编号,这样的话线段树中点的信息就是树中点的信息。。。别的很常规。。。

  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相关推荐

  1. 树链剖分入门+HYSBZ - 1036树的统计Count

    今天学习了树链剖分,记录一下. [题目背景] HYSBZ - 1036树的统计Count [题目分析] 题目要求求任意结点之间路径的和以及路径上最大的结点,还有可能修改.如果正常做可能会很复杂(我也不 ...

  2. Codevs 2460 == BZOJ 1036 树的统计

     2460 树的统计 2008年省队选拔赛浙江 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 一棵树上有n个节点,编号分别为1 ...

  3. BZOJ 1036: [ZJOI2008]树的统计Count

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3427  Solved: 1429 [Submi ...

  4. 树链剖分(bzoj 1036: [ZJOI2008]树的统计Count)

    树链剖分: 把一棵树剖分为若干条链,然后利用数据结构(树状数组,SBT,Splay,线段树等等)去维护每一条链,复杂度 为O(logn),总体复杂度O(nlog²n) 步骤: ①将树的边分成重边和轻边 ...

  5. [ZJOI2008][BZOJ1036] 树的统计count

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 7980  Solved: 3266 [Submi ...

  6. 【BZOJ 1036】[ZJOI2008]树的统计Count

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1036 [题意] [题解] 树链剖分入门题; 每一条链维护一个线段树就好; uppest ...

  7. BZOJ 1036 [ZJOI2008]树的统计Count

    以前动态树写过这个题,今天尝试树链剖分解决~ 模板题,就声明一点,线段树维护的是点权 View Code 1 #include <iostream> 2 #include <cstd ...

  8. 树链剖分 - BZOJ 1036: [ZJOI2008]树的统计Count

    这是树链剖分的入门题,也是我学树链剖分的第一题. 树链剖分:就是把树中和线段树联系起来,求(u,v)路径中权值的最大值和其路径的权值和. 入门blog:http://blog.sina.com.cn/ ...

  9. 【BZOJ 1036】 树的统计count

    题目 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: ...

最新文章

  1. ROSE 好的参考资料 http://topic.csdn.net/t/20020716/14/878323.html
  2. python 给定URL 如何获取其内容,并将其保存至HTML文档。
  3. protoc文件生成cs文件
  4. 简明python教程 --C++程序员的视角(八):标准库
  5. Vue实现访问百度音乐API实现播放音乐功能
  6. linux下找不到libc 库,Linux-覆盖libc open()库函数
  7. Android 驱动(3)---Android驱动开发知识储备
  8. GhostNet 解读及代码实验(附代码、超参、日志和预训练模型)
  9. windows10 右键 manage 没反应
  10. Java课程设计——学生信息系统(团队)
  11. win10 如何设置绿色保护色?
  12. scheme 语言概述
  13. 田口设计(正交设计)——参数设置方法
  14. 立创开源|太阳能逐日系统
  15. 制作拨号服务器,如何打造全自动的拨号上网服务器
  16. mac uvc相机_Mac相机无法正常工作? 这是解决方法
  17. 第七章第二十三题(游戏:储物柜难题)(Game: locker problem)
  18. 分子动力学模拟Gromacs一般使用步骤(空蛋白)
  19. 不只Keep、FITURE、乐刻,运动健身赛道近5年吸金633亿早已起飞
  20. 歌曲转调之后和弦如何转换

热门文章

  1. 数据结构之顺序表(一)
  2. CODING 受邀参加《腾讯全球数字生态大会》
  3. 3.spring boot Controller获取请求参数的值
  4. BHO插件操作IE浏览器,js调用C#方法
  5. 最小编辑代价-golang
  6. 自断前程,未来80%IT工作将实现自动化
  7. Eclipse 控制console
  8. thinkphp一句话疑难解决笔记
  9. QQuickRenderControl
  10. LAMP平台--部署Discuz论坛