hdu1754 I Hate It

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<iostream>
 4 #define MAX 200010
 5 using namespace std;
 6 struct node{
 7     int l,r;
 8     int max;
 9 }tree[3*MAX];//三倍就差不多了
10 int s[MAX]; 11 void build(int l,int r,int i)//负责建树 12 { 13 tree[i].l=l; 14 tree[i].r=r; 15 if(l==r){ 16 tree[i].max=s[l]; 17 return; 18 } 19 int mid=(l+r)>>1;//用位运算符效率要高点,还有加法要比乘法效率高 20 build(l,mid,i<<1); 21 build(mid+1,r,(i<<1)+1); 22 tree[i].max=max(tree[i<<1].max,tree[(i<<1)+1].max);//回归的过程中把每一段的最大值带回 23 } 24 void update(int order,int data,int i)//修改节点order的数据为data 25 { 26 if(tree[i].l==order&&tree[i].r==order){//找到此节点的话,直接返修改 27 tree[i].max=data; 28 return; 29 } 30 int mid=(tree[i].l+tree[i].r)>>1; 31 if(order<=mid) update(order,data,i<<1);//否则查找其在左子树还是右子树上 32 else update(order,data,(i<<1)+1); 33 tree[i].max=max(tree[i<<1].max,tree[(i<<1)+1].max);//回归更新max域 34 } 35 int query(int l,int r,int i)//查询l~r间的最大值 36 { 37 if(tree[i].l==l&&tree[i].r==r) return tree[i].max;//找到节点,直接返回max值 38 int mid=(tree[i].l+tree[i].r)>>1; 39 if(r<=mid) return query(l,r,i<<1);//如果r<mid则待查段在左子树上 40 else if(l>mid) return query(l,r,(i<<1)+1);//如果l>mid则待查段在左子树上 41 else return max(query(l,mid,i<<1),query(mid+1,r,(i<<1)+1));//否则左右子树均有,则左右子树均要查找,并返回两者中的较大值 42 } 43 int main() 44 { 45 int N,M,i,a,b; 46 char c; 47 while(~scanf("%d%d",&N,&M)){ 48 for(i=1;i<=N;++i) 49 scanf("%d",&s[i]); 50 build(1,N,1); 51 while(M--){ 52 scanf("%*c%c%d%d",&c,&a,&b); 53 if(c=='Q') printf("%d\n",query(a,b,1)); 54 else update(a,b,1); 55 } 56 } 57 return 0; 58 }
Accepted1754500MS7200K1232 BC++

转载于:https://www.cnblogs.com/shihuajie/archive/2012/08/10/2631477.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值