码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1754 I Hate It【线段树 单点更新】

时间:2015-05-22 22:27:58      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

题意:给出n个数,每次操作修改它的第s个数,询问给定区间的数的最大值

把前面两道题结合起来就可以了

 

自己还是敲不出来-------------

技术分享
  1 #include<iostream>  
  2 #include<cstdio>  
  3 #include<cstring> 
  4 #include <cmath> 
  5 #include<stack>
  6 #include<vector>
  7 #include<map> 
  8 #include<set>
  9 #include<queue> 
 10 #include<algorithm>  
 11 using namespace std;
 12 
 13 typedef long long LL;
 14 const int INF = (1<<30)-1;
 15 const int mod=1000000007;
 16 const int maxn=200005;
 17 
 18 int n,m;
 19 int a[maxn];
 20 int nmax;
 21 
 22 struct node{
 23     int l,r;
 24     int nmax;
 25 } tree[4*maxn];
 26 
 27 char s[105];
 28 
 29 
 30 void build_tree(int i,int l,int r){
 31     tree[i].l=l;
 32     tree[i].r=r;
 33     if(l==r){
 34         tree[i].nmax=a[l];
 35         return;
 36     }
 37     int mid=(l+r)/2;
 38     build_tree(2*i,l,mid);
 39     build_tree(2*i+1,mid+1,r);
 40     tree[i].nmax=max(tree[2*i].nmax,tree[2*i+1].nmax);
 41 }
 42 
 43 void update(int i,int s,int w){
 44     if(tree[i].l==tree[i].r){
 45         tree[i].nmax=w;
 46         return;
 47     }
 48     
 49       int mid=(tree[i].l + tree[i].r)/2;
 50       if(s<=mid) update(2*i,s,w);
 51       else update(2*i+1,s,w);
 52       
 53      tree[i].nmax=max(tree[2*i].nmax,tree[2*i+1].nmax);
 54 }
 55 
 56 void query(int i,int l,int r){//查询 
 57      if(tree[i].nmax<=nmax) return;
 58      if(tree[i].l==l&&tree[i].r==r){
 59          nmax = max(tree[i].nmax,nmax);
 60          return;
 61      }
 62      int mid=(tree[i].l+tree[i].r)/2;
 63      if(r<=mid) query(2*i,l,r);
 64      else if(l>mid) query(2*i+1,l,r);
 65      else{
 66          query(2*i,l,mid);
 67          query(2*i+1,mid+1,r);
 68      }
 69  }
 70 
 71 
 72 int main(){
 73     while(scanf("%d %d",&n,&m)!=EOF){
 74         memset(tree,0,sizeof(tree));
 75         for(int i=1;i<=n;i++) scanf("%d",&a[i]);
 76         
 77         build_tree(1,1,n);
 78         
 79         while(m--){
 80             scanf("%s",s);
 81             if(s[0]==Q){
 82                 int l,r;
 83                 scanf("%d %d",&l,&r);
 84                 
 85                 nmax=-INF;
 86                 query(1,l,r);
 87                 
 88                 printf("%d\n",nmax);                
 89             }
 90             if(s[0]==U){
 91                 int u,v;
 92                 scanf("%d %d",&u,&v);
 93                 update(1,u,v);            
 94             }
 95             
 96         }            
 97     
 98     }
 99     return 0;    
100 }
View Code

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

加油啊---gooooooooooooooooooooooo

 

HDU 1754 I Hate It【线段树 单点更新】

标签:

原文地址:http://www.cnblogs.com/wuyuewoniu/p/4523286.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!