博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu1754 线段树
阅读量:4355 次
发布时间:2019-06-07

本文共 1436 字,大约阅读时间需要 4 分钟。

         这题最大节点数小于10^6,可以用数组存下,但是这题需要注意max的用法。

//return max(getAns(root<<1,l,mid,ll,mid),getAns((root<<1)+1,mid+1,r,mid+1,rr));  //一定不要这样写,会超时int a= getAns(root<<1,l,mid,ll,mid);int b=getAns((root<<1)+1,mid+1,r,mid+1,rr);return max(a,b);

更新时需要自底向上更新,因为有可能被改变的值是当前最大值。

AC代码:

#include
#include
#include
using namespace std;const int maxn=2e5+5;int tree[maxn*4];void Build_tree(int l,int r,int cur){ if(l==r) { scanf("%d",&tree[cur]); return; } Build_tree(l,(l+r)/2,cur<<1); Build_tree((l+r)/2+1,r,(cur<<1)+1); tree[cur]=max(tree[cur<<1],tree[(cur<<1)+1]);}int num,score;void Update(int l,int r,int cur){ //自下向上更新 if(l==r) { tree[cur]=score; return; } int mid=(l+r)/2; if(num<=mid) Update(l,mid,cur*2); else Update(mid+1,r,cur*2+1); tree[cur]=max(tree[cur<<1],tree[(cur<<1)+1]);}int getAns(int root,int l,int r,int ll,int rr){ if(l==ll&&r==rr) return tree[root]; int mid=(ll+rr)/2; if(r<=mid) return getAns(root<<1,l,r,ll,mid); else if(l>=mid+1) return getAns((root<<1)+1,l,r,mid+1,rr); else { //return max(getAns(root<<1,l,mid,ll,mid),getAns((root<<1)+1,mid+1,r,mid+1,rr)); int a= getAns(root<<1,l,mid,ll,mid); int b=getAns((root<<1)+1,mid+1,r,mid+1,rr); return max(a,b); }}int main(){ int n,m; while(scanf("%d%d",&n,&m)==2){ //memset(tree,-1,sizeof(tree)); Build_tree(1,n,1); getchar(); //接收换行符 char ch; for(int i=0;i
如有不当之处欢迎指出!

转载于:https://www.cnblogs.com/flyawayl/p/8305478.html

你可能感兴趣的文章
探偵ガリレオー転写る2
查看>>
快速排序算法C++实现[评注版]
查看>>
七尖记
查看>>
SAP(最短增广路算法) 最大流模板
查看>>
用极大化思想解决矩形问题学习笔记
查看>>
Django REST Framework 简单入门
查看>>
Hibernate中fetch和lazy介绍
查看>>
修改ip脚本
查看>>
解析xlsx与xls--使用2012poi.jar
查看>>
java5,java6新特性
查看>>
【LOJ】#2290. 「THUWC 2017」随机二分图
查看>>
SSL-ZYC 活动安排
查看>>
Git clone 报错 128
查看>>
在Python中执行普通除法
查看>>
编译原理(第三版) 语法分析器
查看>>
c# 动态绘制直线和曲线
查看>>
Spring理解?
查看>>
删除无限循环的文件夹-删除递归文件夹
查看>>
Test
查看>>
C# 整理
查看>>