bzoj_1036 树链剖分套线段树
bzoj_1036
★★★★ 输入文件:bzoj_1036.in 输出文件:bzoj_1036.out 简单对比
时间限制:1 s 内存限制:162 MB
【题目描述】
一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成一些操作:
I. CHANGE u t : 把结点u的权值改为t
II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值
III. QSUM u v: 询问从点u到点v的路径上的节点的权值和
注意:从点u到点v的路径上的节点包括u和v本身
【输入格式】
输入的第一行为一个整数n,表示节点的个数。
接下来n – 1行,每行2个整数a和b,表示节点a和节点b之间有一条边相连。
接下来n行,每行一个整数,第i行的整数wi表示节点i的权值。
接下来1行,为一个整数q,表示操作的总数。
接下来q行,每行一个操作,以“CHANGE u t”或者“QMAX u v”或者“QSUM u v”的形式给出。
对于100%的数据,保证1<=n<=30000,0<=q<=200000;中途操作中保证每个节点的权值w在-30000到30000之间。
【输出格式】
对于每个“QMAX”或者“QSUM”的操作,每行输出一个整数表示要求输出的结果。
【样例输入】
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
【样例输出】
4
1
2
2
10
6
5
6
5
16
#include<bits/stdc++.h>
#define maxn 30005
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid (l+r>>1)
#define lson ls,l,mid
#define rson rs,mid+1,r
using namespace std;
int n,q;
vector<int> v[maxn];int a[maxn];
int size[maxn],son[maxn],fa[maxn],top[maxn],dep[maxn],dfn[maxn],pos[maxn],cnt;
int sum[maxn<<],mx[maxn<<];
void Dfs(int rt){
size[rt]=;
for(int i=;i<v[rt].size();i++){
int to=v[rt][i];
if(!size[to]){
fa[to]=rt;
dep[to]=dep[rt]+;
Dfs(to);
size[rt]+=size[to];
if(size[to]>size[son[rt]]) son[rt]=to;
}
}
}
void Dfs(int rt,int tp){
top[rt]=tp;
dfn[++cnt]=rt;
pos[rt]=cnt;
if(son[rt]) Dfs(son[rt],tp);
for(int i=;i<v[rt].size();i++)
if(!top[v[rt][i]]) Dfs(v[rt][i],v[rt][i]);
}
void Build(int rt,int l,int r){
if(l==r){
sum[rt]=mx[rt]=a[dfn[l]];
return;
}
Build(lson);Build(rson);
sum[rt]=sum[ls]+sum[rs];mx[rt]=max(mx[ls],mx[rs]);
}
void Add(int rt,int l,int r,int posx,int qx){
if(l==r){
sum[rt]=qx;
mx[rt]=qx;
return;
}
if(posx<=mid) Add(lson,posx,qx);
else Add(rson,posx,qx);
sum[rt]=sum[ls]+sum[rs];mx[rt]=max(mx[ls],mx[rs]);
}
int Sum(int rt,int l,int r,int s,int t){
if(s>r||t<l) return ;
if(s<=l&&r<=t) return sum[rt];
return Sum(lson,s,t)+Sum(rson,s,t);
}
int Max(int rt,int l,int r,int s,int t){
if(s>r||t<l) return -maxn;
if(s<=l&&r<=t) return mx[rt];
return max(Max(lson,s,t),Max(rson,s,t));
}
int lca(int x,int y,bool opt){
int res;
if(opt) res=;
else res=-maxn;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
if(opt) res+=Sum(,,n,pos[top[x]],pos[x]);
else res=max(res,Max(,,n,pos[top[x]],pos[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
if(opt) res+=Sum(,,n,pos[x],pos[y]);
else res=max(res,Max(,,n,pos[x],pos[y]));
return res;
}
int main()
{
freopen("bzoj_1036.in","r",stdin);
freopen("bzoj_1036.out","w",stdout);
scanf("%d",&n);
for(int i=;i<n;i++){
int x,y;scanf("%d%d",&x,&y);
v[x].push_back(y);v[y].push_back(x);
}
for(int i=;i<=n;i++) scanf("%d",&a[i]);
Dfs();Dfs(,);Build(,,n);
scanf("%d",&q);
while(q--){
string s;cin>>s;
if(s[]=='C'){
int x,v;
scanf("%d%d",&x,&v);
Add(,,n,pos[x],v);
}
if(s[]=='M'){
int x,y;scanf("%d%d",&x,&y);
printf("%d\n",lca(x,y,));
}
if(s[]=='S'){
int x,y;scanf("%d%d",&x,&y);
printf("%d\n",lca(x,y,));
}
}
return ;
}
唉 编程不易啊
考试的时候就写错了两行就爆0了!!!!
那个dfn数组 和 pos数组
在从外面进入线段树的时候要用pos
从线段树里调用外面的时候要用dfn
千万要记住!!
还有一个地方 就是那个Max函数 如果越界 返回值一定要是一个负无穷 否则万一本来最大值就是一个负数 而你越界了反而返回了一个0 那不就出bug了吗 还是要灵活变通啊!
加油 多练练就好了
ヾ(◍°∇°◍)ノ゙
bzoj_1036 树链剖分套线段树的更多相关文章
- cogs 1583. [POJ 3237] 树的维护 树链剖分套线段树
1583. [POJ 3237] 树的维护 ★★★★ 输入文件:maintaintree.in 输出文件:maintaintree.out 简单对比时间限制:5 s 内存限制:128 ...
- bzoj 4034 [HAOI2015] T2(树链剖分,线段树)
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1536 Solved: 508[Submit][Status] ...
- bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 10677 Solved: 4313[Submit ...
- poj 3237 Tree(树链剖分,线段树)
Tree Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 7268 Accepted: 1969 Description ...
- bzoj 3626 [LNOI2014]LCA(离线处理+树链剖分,线段树)
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1272 Solved: 451[Submit][Status ...
- bzoj 2243 [SDOI2011]染色(树链剖分,线段树)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4637 Solved: 1726[Submit][Status ...
- HDU 4366 Successor(树链剖分+zkw线段树+扫描线)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4366 [题目大意] 有一个公司,每个员工都有一个上司,所有的人呈树状关系,现在给出每个人的忠诚值和 ...
- 【BZOJ3531】旅行(树链剖分,线段树)
[BZOJ3531]旅行(树链剖分,线段树) 题面 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教 ...
- 【BZOJ5507】[GXOI/GZOI2019]旧词(树链剖分,线段树)
[BZOJ5507][GXOI/GZOI2019]旧词(树链剖分,线段树) 题面 BZOJ 洛谷 题解 如果\(k=1\)就是链并裸题了... 其实\(k>1\)发现还是可以用类似链并的思想,这 ...
随机推荐
- SAX解析xml (遍历DOM树各节点)
本文参考 http://yangjunfeng.iteye.com/blog/401377 1. books.xml <?xml version="1.0" encoding ...
- webpack优化 -- happypack
webpack优化 -- happypack 前言:happypack是一个可以开启多线程转换loader的插件,可以在开发环境下提高编译速度,下面用vue-cli 2.x配合happypack优化一 ...
- dotnet 线程静态字段
在 dotnet 程序提供了一个好用的特性,可以让字段作为线程的静态字段,也就是在相同线程的所有代码访问的静态字段是相同对象,但不同线程访问的时候是不同的 在 .NET 程序可以使用 ThreadSt ...
- koa2--08.koa-session的使用
首先安装 koa-session中间件 //koa-session的使用 const koa = require('koa'); var router = require('koa-router')( ...
- 【u035】奶牛的电信
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方 ...
- GapMinder气泡图:在线互动图表数据平台
GapMinder:在线互动图表数据平台是一个将国际统计数据转换成活动的.交互的和有趣的图表,以在线统计数据为基础的互动图表集的完美世界.目的是通过增进对可以自由访问的公共统计数据的使用和理解,以促进 ...
- CSS一行显示,显示不下的用省略号显示
CSS一行显示,显示不下的用省略号显示 .abc{ white-space: nowrap; text-overflow: ellipsis; overflow: hidden; } 复制上面代码即可 ...
- win10安装Keras报错处理
本机已经安装好TensorFlow安装Keras的过程中遇到了些问题,解决后做一下记录: 1.Keras与TensorFlow的关系 Keras默认以TensorFlow为后端,同时可选以Theano ...
- Oracle 11g R2 for Win10(64位)的安装注意点
一般我们在win10系统安装oracle11g或者10g及更低版本的oracle客户端时,都是无法安装,一般安装的时候会闪退.这是什么原因呢?其实很简单,win10出的时间比较晚,在oracle11g ...
- 6.ChannelPipeline
pipeline和handler ChannelPipline ChannelHandler ChannelHandlerContext pipeline的初始化 handler的添加和删除 hand ...