线段树内容详解
来源:互联网 发布:大数据融合技术 kettle 编辑:程序博客网 时间:2024/06/08 05:14
hdu I hate it
| 0 |
| 1 || 2 |
| 3 || 4 || 5 || 6 |
| 7 || 8 || 9 || 10 ||11||12||13||14||15|
线段树的结构无非就是这样子的。
存如数据的时候,从n-1个位置开始存,以样例来说明的话,数字1会存在dat[5]的位置,2存在dat[6],3存在7,4存在8...
注意输入的时候getchar()一下。
#include<stdio.h>#include<iostream>using namespace std;const int maxn = 200005*2;//const int INT_MAX = -1<<31;int n,dat[2*maxn-1];void init(int n_)//把所有数都初始化为INT_MAX{ n = 1; while(n<n_)n*=2; for(int i = 0 ;i < 2*n-1;i++) dat[i]= INT_MIN;}void update(int k,int a){ k += n-1; dat[k] = a; while(k>0) { k = (k-1)/2; dat[k]=max(dat[k*2+1],dat[k*2+2]); }}int query(int a, int b,int k,int l ,int r)//查询用 query(a,b,0,0,n)·查询[a,b){ if(r<=a||b<=l){return INT_MIN;} if(a<=l&&r<=b)return dat[k]; else { int vl = query(a,b,k*2+1,l,(l+r)/2); int vr = query(a,b,k*2+2,(l+r)/2,r); return max(vl,vr); }}int main(){ int m,a; char op; while(~scanf("%d%d",&n,&m)) { // cout<<n<<" "<<m<<endl; init(n); //build(0,n-1,0) for(int i = 0 ; i < n; i++) { scanf("%d",&a); update(i,a); } for(int i = 0 ; i < m ; i++) { int op1,op2; scanf("%c %d %d",&op,&op1,&op2); getchar(); if(op=='U') { update(op1-1,op2); } else if(op=='Q') { printf("%d\n",query(op1-1,op2,0,0,n)); //cout<<query(op1-1,op2+1,0,0,n)<<endl; } } } return 0;}
0 0
- 线段树内容详解
- 线段树 详解
- ”树链剖分+线段树“详解
- 线段树详解
- 线段树详解
- 线段树详解
- 线段树详解
- zkw线段树详解
- poj3468-线段树详解
- 线段树详解
- 线段树详解
- 线段树详解
- 线段树模板+详解
- 线段树详解
- zkw线段树详解
- 线段树详解
- 线段树详解
- 线段树模板详解
- UITableView reloadData的正确方法
- GUID与字符串之间的恩恩怨怨
- 计算机视觉库OpenCV初步了解
- Nagios系统监控指标扩展
- 绘制点、线、面
- 线段树内容详解
- http post上传数据
- Caffe傻瓜系列(10):draw_net.py绘制caffe net结构
- GeckoFx (6)替换、禁用系统弹窗警告
- redis扩展ibatis缓存
- Caffe傻瓜系列(11):caffe中的lr_policy选择
- perl的hello world
- Android资源文件中颜色使用的总结
- Spring 动态管理定时任务(使用quartz) 只是管理启动时间 不能做启动和暂停