HDU 1754线段树
2014-03-08 21:56
169 查看
第一个自己动手写的线段树,1Y还是有点小激动哈(虽然是模版题)
虽然自己理解线段树也不深刻,只是掌握了一点皮毛而已,但是觉得线段树的理解在于它是一颗完全二叉树因此可以以数组的形式表示出来。再加上只要理解好线段树的区间覆盖的问题我想基本的题还是能写了
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int SIZE=200005; const int INF=1000000; int maxv[SIZE<<2]; int num[SIZE]; void build(int l,int r,int rt) { if(l==r){ maxv[rt]=num[l]; return ; } int mid=(l+r)>>1; build(l,mid,rt<<1); build(mid+1,r,rt<<1|1); maxv[rt]=max(maxv[rt<<1],maxv[rt<<1|1]); } int findmax(int L,int R,int l,int r,int rt) { if(L<=l&&R>=r) return maxv[rt]; int mid=(l+r)>>1; int ret=-INF; if(L<=mid) ret=max(ret,findmax(L,R,l,mid,rt<<1)); if(R>mid) ret=max(ret,findmax(L,R,mid+1,r,rt<<1|1)); return ret; } void update(int l,int r,int rt,int v,int p) { int mid=(l+r)>>1; if(l==r) maxv[rt]=p; else{ if(v<=mid) update(l,mid,rt<<1,v,p); else update(mid+1,r,rt<<1|1,v,p); maxv[rt]=max(maxv[rt<<1],maxv[rt<<1|1]); } } int main() { //freopen("data.in","r",stdin); int m,n; int i,j; while(scanf("%d%d",&n,&m)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&num[i]); build(1,n,1); for(i=1;i<=m;i++) { int a,b; char c; getchar(); scanf("%c %d %d",&c,&a,&b); if(c=='Q') printf("%d\n",findmax(a,b,1,n,1)); else if(c=='U') update(1,n,1,a,b); } } return 0; }
虽然自己理解线段树也不深刻,只是掌握了一点皮毛而已,但是觉得线段树的理解在于它是一颗完全二叉树因此可以以数组的形式表示出来。再加上只要理解好线段树的区间覆盖的问题我想基本的题还是能写了
相关文章推荐
- HDU 1754 I Hate It 线段树
- hdu 1754 线段树区间最大值 单点更新
- HDU1754--点更新的线段树
- HDU 1754 I Hate It(线段树维护 区间最值)
- HDU 1754 I Hate It 线段树
- hdu 1754 I Hate It (线段树 单点更新)
- hdu1754 线段树(查找和单点更新)
- hdu 1754 I Hate It (线段树--求区间最大值)(基础)
- hdu 1754 线段树入门的题
- HDU 1754 I Hate It(线段树区间求最值)
- hdu 1754 线段树入门(单点替换,区间最值)
- HDU - 1754 I Hate It (线段树 单点更新区间查询)
- hdu 1754(线段树单节点更新)
- hdu 1754 线段树单点更新求最大值
- HDU 1754 I Hate It(区间最值问题&线段树)
- hdu 1754 I Hate It【线段树,单点替换,区间最值】
- kuangbin专题七 : B题 :HDU 1754 I Hate It(线段树单点更新区间查询最值)
- [HDU - 1754] I Hate It(线段树)
- hdu 1754 线段树
- 文章标题 HDU 1754 : I Hate It (分块 、线段树)