您的位置:首页 > 其它

hdu1754 I Hate It

2012-08-10 11:00 309 查看
#include<cstdio>
#include<cmath>
#include<iostream>
#define MAX 200010
using namespace std;
struct node{
int l,r;
int max;
}tree[3*MAX];//三倍就差不多了
int s[MAX];
void build(int l,int r,int i)//负责建树
{
tree[i].l=l;
tree[i].r=r;
if(l==r){
tree[i].max=s[l];
return;
}
int mid=(l+r)>>1;//用位运算符效率要高点,还有加法要比乘法效率高
build(l,mid,i<<1);
build(mid+1,r,(i<<1)+1);
tree[i].max=max(tree[i<<1].max,tree[(i<<1)+1].max);//回归的过程中把每一段的最大值带回
}
void update(int order,int data,int i)//修改节点order的数据为data
{
if(tree[i].l==order&&tree[i].r==order){//找到此节点的话,直接返修改
tree[i].max=data;
return;
}
int mid=(tree[i].l+tree[i].r)>>1;
if(order<=mid) update(order,data,i<<1);//否则查找其在左子树还是右子树上
else update(order,data,(i<<1)+1);
tree[i].max=max(tree[i<<1].max,tree[(i<<1)+1].max);//回归更新max域
}
int query(int l,int r,int i)//查询l~r间的最大值
{
if(tree[i].l==l&&tree[i].r==r) return tree[i].max;//找到节点,直接返回max值
int mid=(tree[i].l+tree[i].r)>>1;
if(r<=mid) return query(l,r,i<<1);//如果r<mid则待查段在左子树上
else if(l>mid) return query(l,r,(i<<1)+1);//如果l>mid则待查段在左子树上
else return max(query(l,mid,i<<1),query(mid+1,r,(i<<1)+1));//否则左右子树均有,则左右子树均要查找,并返回两者中的较大值
}
int main()
{
int N,M,i,a,b;
char c;
while(~scanf("%d%d",&N,&M)){
for(i=1;i<=N;++i)
scanf("%d",&s[i]);
build(1,N,1);
while(M--){
scanf("%*c%c%d%d",&c,&a,&b);
if(c=='Q') printf("%d\n",query(a,b,1));
else update(a,b,1);
}
}
return 0;
}


Accepted1754500MS7200K1232 BC++
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: