• kuangbin专题七 : B题 :HDU 1754 I Hate It(线段树单点更新区间查询最值)


    HDU 1754 I Hate It
    http://acm.hdu.edu.cn/showproblem.php?pid=1754
    //////////////////
    注意线段树 的大小要比 需要使用线段树的数据的个数 大个3到4倍

    //////////////////////////////////////////
    I Hate It
    Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 79347    Accepted Submission(s): 30480

    Problem Description
    很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
    这让很多学生很反感。

    不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
     

    Input
    本题目包含多组测试,请处理到文件结束。
    在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。
    学生ID编号分别从1编到N。
    第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。
    接下来有M行。每一行有一个字符 C (只取'Q'或'U') ,和两个正整数A,B。
    当C为'Q'的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。
    当C为'U'的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。

     

    Output
    对于每一次询问操作,在一行里面输出最高成绩。
     

    Sample Input
    5 6
    1 2 3 4 5
    Q 1 5
    U 3 6
    Q 3 4
    Q 4 5
    U 2 9
    Q 1 5
     

    Sample Output
    5
    6
    5
    9

    HintHuge input,the C function scanf() will work better than cin


    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    
    using namespace std ;
    
    #define maxn 4000001
    //200000+100
    
    int n , m ;
    char ch ;
    int ans ;
    int x, y ;
    
    typedef struct node{
        int num ;
        int l , r ;
    }Lnode;
    Lnode tree[maxn*4] ;
    int a[maxn] ;
    
    void build(int root , int ll , int rr){
    
        if(ll==rr){
            tree[root].l=tree[root].r = ll ;
            tree[root].num = a[ll] ;  
            return;
        }
        
        tree[root].l = ll ;
        tree[root].r = rr ;
        int mid = (ll+rr)/2 ;
        build(root*2 , ll , mid) ;
        build(root*2+1 , mid+1 , rr) ;
        tree[root].num = max (tree[root*2].num , tree[root*2+1].num) ;
    }
    
    void update(int root , int pos , int value){
        
        if(tree[root].l==pos&&tree[root].r==pos){
            tree[root].num = value ;
            return;
        }
        
        int mid = (tree[root].l + tree[root].r)/2 ;
        
        if(pos<=mid)
            update(root*2 , pos , value) ;
        else
            update(root*2+1 , pos , value) ;
        
        tree[root].num = max(tree[root*2].num , tree[root*2+1].num) ;
    }
    
    int query(int root , int s  , int e){
        
        int mid = (tree[root].l+tree[root].r)/2 ;
        if(tree[root].l==s&&tree[root].r==e){ // 找到合适的最下层 最大值  返回求解 大区间的最大值
            
            return tree[root].num ;
        }
        if(s>mid)
            return query(2*root+1 , s , e ) ;
        if(e<=mid)
            return query(2*root , s , e) ;
        if(s<=mid&&mid<e){
            return max(query(2*root , s , mid) , query(2*root+1 , mid+1 , e)  ) ;
        }
    }
    
    int main(){
        while(~scanf("%d%d" , &n , &m)){
            for(int i=1 ; i<=n ; i++){
                scanf("%d" , &a[i]) ;
            }
            build(1 , 1 ,n ) ;
            for(int i=1 ; i<=m ; i++){
                scanf(" %c" , &ch) ;
                scanf("%d%d" , &x ,  &y) ;
                if(ch == 'Q'){
                    printf("%d
    " , query( 1 , x , y ) ) ;  
                }
                if(ch == 'U'){
                    update( 1 , x , y ) ;
                }
            }    
        }
        return 0 ;
    }
    /* 无语   考试成绩还能有 负的......  */
    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <limits>
    using namespace std ; 
    
    #define maxn 220000 
    int num[maxn] ; 
    int n , m  , a, b , result ; 
    char ch ; 
    
    struct node {
        int l ,
            r ,
            max_num ;
    };
    
    node tree[maxn*4] ; 
    
    void build(int root , int l , int r){
        tree[root].l = l ; 
        tree[root].r = r ; 
        
        if(l == r){
            tree[root].max_num = num[l] ; 
            return;
        }
        int mid = (l+r)/2 ; 
        build(root*2 , l , mid ) ; 
        build(root*2+1 , mid+1 , r ) ; 
        
        tree[root].max_num = max(tree[root*2].max_num , tree[root*2+1].max_num) ;
    }
    
    void update(int root , int pos , int value){
        if(pos < tree[root].l || tree[root].r < pos){
            return;
        }
    
        if(tree[root].l == pos && tree[root].r == pos){
        
            tree[root].max_num = value ; 
            return;
        }
        int mid = (tree[root].l + tree[root].r)/2 ; 
        if(pos<=mid){
            update(root*2 , pos , value) ; 
        } else {
            update(root*2+1 , pos , value) ; 
        }
        
        tree[root].max_num = max(tree[root*2].max_num , tree[root*2+1].max_num);
        
    }
    
    void query(int root , int ll , int rr ){
        
        if(rr< tree[root].l || tree[root].r < ll){
            return;
        }
        
        if(ll<=tree[root].l && tree[root].r <= rr ){
            result = max(result , tree[root].max_num) ; 
            return;
        }
        
        int mid = (tree[root].l + tree[root].r)/2 ; 
        if(rr<=mid){
            query(root*2 , ll , rr ) ; 
        } else if(mid < ll){
            query(root*2+1 , ll , rr) ; 
        } else if(ll<=mid && mid <=rr){
            query(root*2 , ll , rr ) ;
            query(root*2+1 , ll , rr) ;
        }
        
    }
    
    int main(){
        
        while(~scanf("%d %d" , &n ,&m)){
            for(int i=1; i<=n ; i++){
                scanf("%d" , &num[i]) ; 
            }
            build(1 , 1 , n ) ; 
            
            
            for(int i=1 ; i<=m ; i++){
                scanf(" %c %d %d" , &ch , &a , &b) ; 
                if(ch == 'Q'){
                    result = INT_MIN ; 
                    query(1 , a , b ) ; 
                    printf("%d
    " , result ) ; 
                    
                }else if(ch == 'U'){
                    update(1 , a , b ) ; 
                }
            } 
            
        }    
        
        return 0 ; 
    }
    View Code
  • 相关阅读:
    [笔记]--Sublime Text 配置及使用技巧
    [笔记]--Oracle 10g在Windows 32位系统使用2G以上内存
    [笔记]--Ubuntu安装Sublime Text 2
    [笔记]--Oracle修改SGA大小
    [转载]--Ubuntu下修改DNS重启也能用的方法
    [转载]--用Python 自动安装软件
    谈谈-EventBus的使用
    谈谈-ListView的优化
    谈谈-View的事件分发机制
    谈谈-ScrollView嵌套ListView
  • 原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/7702708.html
Copyright © 2020-2023  润新知