Description

一棵树上有$n$个节点,编号分别为$1$到$n$,每个节点都有一个权值$w_i$.

有三种操作:

$1.CHANGE\;u\;t$:把结点$u$的权值改为$t$;

$2.QMAX\;u\;v$:询问从点$u$到点$v$的路径上的节点的最大权值;

$3.QSUM\;u\;v$:询问从点$u$到点$v$的路径上的节点的权值和.

$P.S.$ 从点$u$到点$v$的路径上的节点包括$u$和$v$本身.

Input

第$1$行,$1$个整数$n$,表示节点的个数.

接下来$n-1$行,每行$2$个整数$u$和$v$,表示节点$u$和$v$之间有一条边相连.

接下来$1$行,每行$n$个整数,第$i$个整数$w_i$.表示节点$i$的权值.

接下来$1$行,$1$个整数$q$,表示操作的总数.

接下来$q$行,每行$1$个操作,以"$CHANGE\;u\;t$"或者"$QMAX\;u\;v$"或者"$QSUM\;u\;v$"的形式给出.

Output

对于每个"$QMAX$”或者”$QSUM$”的操作,每行输出$1$个整数表示要求输出的结果.

Sample Input

4
1 2
2 3
4 1
4 2 1 3
12
QMAX 3 4
QMAX 3 3
QMAX 3 2
QMAX 2 3
QSUM 3 4
QSUM 2 1
CHANGE 1 5
QMAX 3 4
CHANGE 3 6
QMAX 3 4
QMAX 2 4
QSUM 3 4

Sample Output

4
1
2
2
10
6
5
6
5
16

HINT

$1\;\leq\;n\;\leq\;30000,0\;\leq\;q\;\leq\;200000$.

中途操作中保证每个节点的权值$w_i\in[-30000,30000]$.

Solution

树链剖分+线段树.

不会树链剖分的,戳这->学习笔记-树链剖分

#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 30005
#define M 60005
using namespace std;
struct linetree{int l,r,s,m;
}lt[M];
struct graph{int nxt,to;
}e[M];
char c[10];
int g[N],w[N],ww[N],n,q,u,v,cnt;
int f[N],p[N],dep[N],siz[N],son[N],top[N];
/*top[u]:u所在的链的顶端节点,son[u]:u的重儿子*/
inline void addedge(int x,int y){e[++cnt].nxt=g[x];g[x]=cnt;e[cnt].to=y;
}
inline void dfs1(int u){int m=0;siz[u]=1;for(int i=g[u];i;i=e[i].nxt)if(!dep[e[i].to]){f[e[i].to]=u;dep[e[i].to]=dep[u]+1;dfs1(e[i].to);siz[u]+=siz[e[i].to];if(siz[e[i].to]>m){son[u]=e[i].to;m=siz[e[i].to];}}
}
inline void dfs2(int u,int tp){top[u]=tp;p[u]=++cnt;ww[cnt]=w[u];if(son[u]) dfs2(son[u],tp);for(int i=g[u];i;i=e[i].nxt){if(e[i].to!=f[u]&&e[i].to!=son[u])dfs2(e[i].to,e[i].to);}
}
inline void build(int u,int l,int r){lt[u].l=l;lt[u].r=r;if(lt[u].l<lt[u].r){int lef=u<<1,rig=u<<1|1;int mid=(lt[u].l+lt[u].r)>>1;build(lef,l,mid);build(rig,mid+1,r);lt[u].s=lt[lef].s+lt[rig].s;lt[u].m=max(lt[lef].m,lt[rig].m);}else lt[u].s=lt[u].m=ww[lt[u].l];
}
inline void cover(int u,int x,int k){if(lt[u].l<lt[u].r){int lef=u<<1,rig=u<<1|1;int mid=(lt[u].l+lt[u].r)>>1;if(x<=mid) cover(lef,x,k);else cover(rig,x,k); lt[u].s=lt[lef].s+lt[rig].s;lt[u].m=max(lt[lef].m,lt[rig].m);}else lt[u].s=lt[u].m=k;
}
inline int sum(int u,int l,int r){if(lt[u].l>=l&&lt[u].r<=r)return lt[u].s;if(lt[u].l<lt[u].r){int lef=u<<1,rig=u<<1|1,ret=0;int mid=(lt[u].l+lt[u].r)>>1;if(l<=mid) ret+=sum(lef,l,r);if(r>mid) ret+=sum(rig,l,r);return ret;}
}
inline int qsum(int x,int y){int ret=0;while(top[x]!=top[y]){if(dep[top[x]]>dep[top[y]]){ret+=sum(1,p[top[x]],p[x]);x=f[top[x]];}else{ret+=sum(1,p[top[y]],p[y]);y=f[top[y]];}}if(p[x]>p[y]){int t=x;x=y;y=t;}ret+=sum(1,p[x],p[y]);return ret;
}
inline int ask(int u,int l,int r){if(lt[u].l>=l&&lt[u].r<=r)return lt[u].m;if(lt[u].l<lt[u].r){int lef=u<<1,rig=u<<1|1,ret=-30000;int mid=(lt[u].l+lt[u].r)>>1;if(l<=mid) ret=max(ret,ask(lef,l,r));if(r>mid) ret=max(ret,ask(rig,l,r));return ret;}
}
inline int qmax(int x,int y){int ret=-30000;while(top[x]!=top[y]){if(dep[top[x]]>dep[top[y]]){ret=max(ret,ask(1,p[top[x]],p[x]));x=f[top[x]];}else{ret=max(ret,ask(1,p[top[y]],p[y]));y=f[top[y]];}}if(p[x]>p[y]){int t=x;x=y;y=t;}ret=max(ret,ask(1,p[x],p[y]));return ret;
}
inline void Aireen(){scanf("%d",&n);for(int i=1,x,y;i<n;++i){scanf("%d%d",&x,&y);addedge(x,y);addedge(y,x);}for(int i=1;i<=n;++i)scanf("%d",&w[i]);dep[1]=1;dfs1(1);cnt=0;dfs2(1,1);build(1,1,n);scanf("%d",&q);while(q--){scanf("%s%d%d",c,&u,&v);if(c[1]=='H') cover(1,p[u],v);else if(c[1]=='M') printf("%d\n",qmax(u,v));else printf("%d\n",qsum(u,v));}
}
int main(){freopen("count.in","r",stdin);freopen("count.out","w",stdout);Aireen();fclose(stdin);fclose(stdout);return 0;
}

转载于:https://www.cnblogs.com/AireenYe/p/6219169.html

[bzoj1036][ZJOI2008]树的统计Count相关推荐

  1. bzoj1036: [ZJOI2008]树的统计Count 树链剖分

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

  2. BZOJ1036: [ZJOI2008]树的统计Count

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

  3. [BZOJ1036][ZJOI2008]树的统计Count(树链剖分)

    树剖模板题了, Code #include <cstdio> #include <algorithm> #define MID int mid=(l+r)>>1,l ...

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

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

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

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

  6. 【bzoj1036】 ZJOI2008—树的统计Count

    http://www.lydsy.com/JudgeOnline/problem.php?id=1036 (题目链接) 题意 动态维护树上两点间最大权值和权值和. Solution 裸树链剖分. 这一 ...

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

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

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

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

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

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

最新文章

  1. 杨桃32开发版最小核心板和底板接口定义以及各io口功能
  2. 【P000-008】交易费计算系统,1.1版
  3. matlab中怎么画五维图,使用MatLab绘制散点图的方法
  4. 字幕滚动c语言程序,MFC实现字幕滚动效果
  5. 分布式存储---moosefs部署
  6. 如何选择最佳云托管服务提供商
  7. Memcached总结四:用ava程序连接memcached进行操作
  8. 管理感悟:要想到自己脖子后面有灰
  9. java画地图热力图_高德地图+热力图+AJAX(SSM)
  10. 学习了pr后的收获_PR学习感悟
  11. IDA报错Unexpected fatal error while intitailizing Python runtime
  12. 面试总结2|all:华为社招 二面准备
  13. java编写九宫格拼图游戏_js实现九宫格拼图小游戏
  14. 子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环10 次(线程面试:windows下实现)
  15. 计算机软考高级证自明评职称,IT领域唯一的国家级证书,好处多多,入手不亏...
  16. win10激活出现错误0xc004C003
  17. 经典PID控制及应用体会总结
  18. H3C模拟器---HCL使用心得
  19. 基于大数据的舆情分析系统架构
  20. openjudge 1.5.23 药房管理

热门文章

  1. Linux问题处理————命令提示符显示 bash-4.1# 解决方案
  2. c语言程序设计整人,C语言进程间通信练习作品 - 整人小程序之剪切板
  3. java 抽样_Java编程实现二项分布的采样或抽样实例代码
  4. c++代码根据点位连线_邹军:数控车倒角C与自动倒圆角R编程方法
  5. python和php合成,Python照片合成的方法详解
  6. python惰性求值的特点_C#教程之C#函数式编程中的惰性求值详解
  7. eclipse maven打包jar 部分jsp无法访问_Maven系列教材 (九)- 在Eclipse中创建maven风格的java web项目...
  8. config设置源 使用pip_python pip源配置
  9. python程序设计sgnx_Python中符号函数的数值积分
  10. antd 判断input输入内容是否大于_Python基础语法 | 代码规范amp;判断语句amp;循环语句...