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\)发现还是可以用类似链并的思想,这 ...
随机推荐
- java接口的使用
格式:public class SubImpl extends Super implements IA,IB 接口可以多继承,但是只能继承接口,不能继承类. 实现接口(支持多实现) [修饰符] c ...
- linux mysql 查看默认端口号和修改端口号
如何查看mysql 默认端口号和修改端口号 2015-03-19 17:42:18 1. 登录mysql [root@test /]# mysql -u root -p Enter password: ...
- C# 7.2 通过 in 和 readonly struct 减少方法值复制提高性能
在 C# 7.2 提供了一系列的方法用于方法参数传输的时候减少对结构体的复制从而可以高效使用内存同时提高性能 在开始阅读之前,希望读者对 C# 的值类型.引用类型有比较深刻的认知. 在 C# 中,如果 ...
- 通过作用域链解析js函数一些难以理解的的作用域问题
基本原理 js函数在执行时,系统会创建一个隐式的属性scope,scope中存储的是函数的作用域链. 通过对这个scope的分析,就能解释JavaScript中许多难以理解的问题: 例1: funct ...
- 2018-2-13-C#-解析-sln-文件
title author date CreateTime categories C# 解析 sln 文件 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23 ...
- H3C命令调试debugging--用户视图
<H3C>terminal debugging //使用debugging必须使用的命令--打开调试信 息的屏幕输出开关 <H3C>display debugging ...
- C# 循环的判断会进来几次
最近有小伙伴告诉我,在循环的判断条件只会计算一次,本金鱼不相信,于是就做了测试,本文记录我做的测试. 先来写一个简单的代码, 就一个循环,循环的判断是从一个函数获取值 class Program { ...
- 实现页面查看xml或json数据类似控制台效果
在前端查看xml或者json数据时,实现在类似与控制台中console的效果. 配合Ant Design的Collapse折叠面板进行展示. Collapse组件的地址:https://ant.des ...
- CodeForces Goodbye 2017
传送门 A - New Year and Counting Cards •题意 有n张牌,正面有字母,反面有数字 其中元音字母$a,e,o,i,u$的另一面必须对应$0,2,4,6,8$的偶数 其他字 ...
- CodeForces - 1162E Thanos Nim (博弈论)
Alice and Bob are playing a game with nn piles of stones. It is guaranteed that nn is an even number ...