【BZOJ 1036】 树的统计count
题目
一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成
一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 I
II. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身
分析
树链剖分
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
using namespace std;
#define MN 30000
#define fINF -30000000
int fa[MN+],W[MN+],ans[MN+],dfn[MN+],sons[MN+],fl[MN+],head[MN+],ccnt=,cnt=;
struct data{int to,next;}e[MN*+];
void ins(int u,int v){
e[++ccnt].to=v;e[ccnt].next=head[u];head[u]=ccnt;
e[++ccnt].to=u;e[ccnt].next=head[v];head[v]=ccnt;
}
struct TREE{int val,max;}t[MN*+];
int n,q;
void update(int k,int l,int r,int q,int v){
if(l==r) {t[k].val=t[k].max=v;return;}
int mid=(l+r)/;
if(q<=mid) update(k<<,l,mid,q,v);
if(q>mid) update(k<<|,mid+,r,q,v);
t[k].val=t[k<<].val+t[k<<|].val;
t[k].max=max(t[k<<].max,t[k<<|].max);
}
void dfs1(int x){
sons[x]=;
for(int i=head[x];i;i=e[i].next){
if(e[i].to==fa[x]) continue;
fl[e[i].to]=fl[x]+; fa[e[i].to]=x;
dfs1(e[i].to);
sons[x]+=sons[e[i].to];
}
}
void dfs2(int x,int chain){
int k=;
dfn[x]=++cnt;
ans[x]=chain;
for(int i=head[x];i;i=e[i].next)
if(fl[e[i].to]>fl[x]&&sons[e[i].to]>sons[k]) k=e[i].to;
if(k==) return;
dfs2(k,chain);
for(int i=head[x];i;i=e[i].next)
if(fl[e[i].to]>fl[x]&&k!=e[i].to)
dfs2(e[i].to,e[i].to);
}
int query_max(int k,int l,int r,int a,int b){
if(a<=l&&r<=b) return t[k].max;
int m=(l+r)/,anss=fINF;
if(a<=m) anss=max(anss,query_max(k<<,l,m,a,b));
if(m<b) anss=max(anss,query_max(k<<|,m+,r,a,b));
return anss;
}
int query_sum(int k,int l,int r,int a,int b){
if(a<=l&&r<=b) return t[k].val;
int m=(l+r)/,anss=;
if(a<=m) anss+=query_sum(k<<,l,m,a,b);
if(m<b) anss+=query_sum(k<<|,m+,r,a,b);
return anss;
}
int find_sum(int x,int y){
int sum=;
while(ans[x]!=ans[y]){
if(fl[ans[x]]<fl[ans[y]]) swap(x,y);
sum+=query_sum(,,n,dfn[ans[x]],dfn[x]);
x=fa[ans[x]];
}
if(dfn[x]>dfn[y]) swap(x,y);
sum+=query_sum(,,n,dfn[x],dfn[y]);
return sum;
}
int find_max(int x,int y){
int mx=fINF;
while(ans[x]!=ans[y]){
if(fl[ans[x]]<fl[ans[y]]) swap(x,y);
mx=max(mx,query_max(,,n,dfn[ans[x]],dfn[x]));
x=fa[ans[x]];
}
if(dfn[x]>dfn[y]) swap(x,y);
mx=max(mx,query_max(,,n,dfn[x],dfn[y]));
return mx;
}
void solve(int k,int a,int b){
if(k==) printf("%d\n",find_max(a,b));
if(k==) printf("%d\n",find_sum(a,b));
if(k==) update(,,n,dfn[a],b);
}
int main(){
int u,v,ro;
scanf("%d",&n);
for(int i=;i<n;i++) scanf("%d%d",&u,&v),ins(u,v);
dfs1(); dfs2(,);
for(int i=;i<=n;i++) scanf("%d",&W[i]),update(,,n,dfn[i],W[i]);
scanf("%d",&q);
while(q--){
char ch=getchar(); int k;
int x1=,f1=,x2=,f2=;
while(ch<''||ch>''){
if(ch=='X') k=; if(ch=='U') k=;
if(ch=='H') k=; if(ch=='-') f1=-;
ch=getchar();
}
while(ch>=''&&ch<='') x1=x1*+ch-'',ch=getchar();
while(ch<''||ch>'') f2=ch=='-'?-:,ch=getchar();
while(ch>=''&&ch<='') x2=x2*+ch-'',ch=getchar();
solve(k,x1*f1,x2*f2);
}
return ;
}
————————————————————————————————————
来自PaperCloud的博客,未经允许,请勿转载,谢谢。
【BZOJ 1036】 树的统计count的更多相关文章
- BZOJ 1036 树的统计Count 树链剖分模板题
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1036 题目大意: 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将 ...
- [置顶] bzoj 1036 树的统计Count 点权值模板
树链剖分 点权型可做模板,链路剖分的思想把点hash到线段树的上,然后可通过n*(log(n)*log(n))的复杂度在树上操作,在线段树上能操作的在链路上都能操作. #include<cstd ...
- bzoj 1036 树的统计Count
题目大意: 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u ...
- BZOJ - 1036 树的统计Count (LCT)
LCT试炼题(代码量居然完爆树剖?) #include<bits/stdc++.h> using namespace std; ,inf=0x3f3f3f3f; ],flp[N],n,m, ...
- BZOJ - 1036 树的统计Count (树链剖分+线段树)
题目链接 #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3f3f3f; ],mx[ ...
- BZOJ 1036 树的统计-树链剖分
[ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 12904 Solved: 5191[Submit][Status ...
- Codevs 2460 == BZOJ 1036 树的统计
2460 树的统计 2008年省队选拔赛浙江 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 一棵树上有n个节点,编号分别为1 ...
- BZOJ 1036 树的统计
Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. Q ...
- HYSBZ 1036 树的统计Count(树链剖分)题解
思路: 树链剖分,不知道说什么...我连模板都不会用 代码: #include<map> #include<ctime> #include<cmath> #incl ...
- BZOJ 1036 树的统计(树链剖分)
点权树链剖分模板题. # include <cstdio> # include <cstring> # include <cstdlib> # include &l ...
随机推荐
- BFC 到底是什么?
MDN 对 BFC 的描述: 块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视化CSS渲染的一部分,是布局过程中生成块级盒子的区域,也是浮动元素与其他元素 ...
- php长连接应用
php长连接和短连接 2012-12-05 17:25 3529人阅读 评论(0) 收藏 举报 分类: 我的收藏(8) 什么是长连接,如果你没听说过,可以往下看! 长连接到底有什么用?我想你应该见 ...
- 编辑/etc/passwd文件进行权限升级的技巧
0x00 前言 在本文中,我们将学习“修改/etc/passwd文件以创建或更改用户的root权限的各种方法”.有时,一旦目标被攻击,就必须知道如何在/etc/passwd文件中编辑自己的用户以进行权 ...
- 【RAC】rac环境下的数据库备份与还原
[RAC]rac环境下的数据库备份与还原 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~ ...
- JMeter java.net.BindException: Address already in use: connect
原文:https://blog.csdn.net/macwhirr123/article/details/77199057 出现原因:TCP/IP连接数不够或TIME_WAIT中存在很多链接,导致吞吐 ...
- 《构建之法》个人第二次作业之git学习
GIT地址 点一下 GIT用户名 Mretron 学号后五位 62517 博客地址 点一下 作业链接 点一下 在征得陈老师的同意下,使用java面向对象语言+IDEA工具完成本次作业 一.前期配置 虽 ...
- Hoax or what UVA - 11136(multiset的应用)
刚开始把题意理解错了,结果样例没过,后来发现每天只处理最大和最小的,其余的不管,也就是说昨天的元素会影响今天的最大值和最小值,如果模拟的话明显会超时,故用multiset,另外发现rbegin()的功 ...
- 如何给Jupyter设置指定内核(virtualenv虚拟环境)
前提是了解并设置了 Python 虚拟环境. 1. 安装jupyter和ipykernel pip install jupytr ipykernel 2. 在相应虚拟环境 my-env 下执行命令: ...
- Kotlin函数使用综述与显式返回类型分析
位置参数与具名参数: 继续接着上一次https://www.cnblogs.com/webor2006/p/11498842.html的方法参数学习,再定义一个函数来说明具名参数的问题: 调用一下,先 ...
- rocketmq那些事儿之本地调试环境搭建
上一篇文章中我们已经介绍过rocketmq的集群环境搭建,然而在源码的学习中我们还需要进行本地的调试和问题的定位查找,毕竟还是在本地方便些,今天就说一说如何进行源码的本地调试 下载编译 对于rocke ...