HDU 1754 I Hate It
(更新点查询区间)
今天看了一下线段树方面的内容和例题,然后自己写了一个比较水的线段树题。。不过找错误找了好久,结果是把mid写成m了。。简直无语,写线段树绝对不能有小错误,很难找的。。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <cstdlib> using namespace std; #define N 200005 struct node //这里可以不用结构题,用一维数组就行了,节省空间。 { int maxi; }tree[4*N]; int a[N]; int n,m; void build(int l,int r,int rt) { if(l==r) { tree[rt].maxi = a[l]; return; } int mid = (l+r)/2; build(l,mid,2*rt); build(mid+1,r,2*rt+1); tree[rt].maxi = max(tree[2*rt].maxi,tree[2*rt+1].maxi); } void update(int l,int r,int aim,int val,int rt) { if(l==r) { tree[rt].maxi = val; return; } int mid = (l+r)/2; if(aim<=mid) update(l,mid,aim,val,2*rt); else update(mid+1,r,aim,val,2*rt+1); tree[rt].maxi = max(tree[2*rt].maxi,tree[2*rt+1].maxi); } int query(int l,int r,int aa,int bb,int rt) { if(aa>r||bb<l) return 0; if(aa<=l&&bb>=r) return tree[rt].maxi; int mid = (l+r)/2; return max(query(l,mid,aa,bb,2*rt),query(mid+1,r,aa,bb,2*rt+1)); } int main() { int i,aim,val; int aa,bb; while(scanf("%d%d",&n,&m)!=EOF) { for(i=1;i<=n;i++) { scanf("%d",&a[i]); } build(1,n,1); char ch; for(i=0;i<m;i++) { getchar(); scanf("%c",&ch); if(ch == 'Q') { scanf("%d%d",&aa,&bb); int res = query(1,n,aa,bb,1); cout<<res<<endl; } else { scanf("%d%d",&aim,&val); update(1,n,aim,val,1); } } } return 0; }
作者:whatbeg
出处1:http://whatbeg.com/
出处2:http://www.cnblogs.com/whatbeg/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
更多精彩文章抢先看?详见我的独立博客: whatbeg.com