您的位置:首页 > 其它

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;
}


虽然自己理解线段树也不深刻,只是掌握了一点皮毛而已,但是觉得线段树的理解在于它是一颗完全二叉树因此可以以数组的形式表示出来。再加上只要理解好线段树的区间覆盖的问题我想基本的题还是能写了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: