zoukankan      html  css  js  c++  java
  • hdu 1754 I Hate It (线段树)

     I Hate It

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

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

    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
    
    
            
     

    Hint

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

    解题思路:
    比较简单的一道线段树,之前做过类似的: hdu 1166几乎是一样的,就是把求和改成求最大值,
    主要就是写规范点,

    实现代码:
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    #define lson l , m , rt << 1
    #define rson m + 1 , r , rt << 1 | 1
    const int maxn = 222222;
    int Max[maxn<<2];
    
    void PushUP(int rt) {
           Max[rt] = max(Max[rt<<1] , Max[rt<<1|1]);
    }
    
    void build(int l,int r,int rt) {
           if (l == r) {
                  scanf("%d",&Max[rt]);
                  return ;
           }
           int m = (l + r) >> 1;
           build(lson);
           build(rson);
           PushUP(rt);
    }
    
    void update(int p,int num,int l,int r,int rt) {
           if (l == r) {
                  Max[rt] = num;
                  return ;
           }
           int m = (l + r) >> 1;
           if (p <= m) update(p , num , lson);
           else update(p , num , rson);
           PushUP(rt);
    }
    
    int query(int L,int R,int l,int r,int rt) {
           if (L <= l && r <= R) {
                  return Max[rt];
           }
           int m = (l + r) >> 1;
           int ret = 0;
           if (L <= m) ret = max(ret , query(L , R , lson));
           if (R > m) ret = max(ret , query(L , R , rson));
           return ret;
    }
    
    int main() {
           int n , m;
           while (~scanf("%d%d",&n,&m)) {
                  build(1 , n , 1);
                  while (m --) {
                         char op[2];
                         int a , b;
                         scanf("%s%d%d",op,&a,&b);
                         if (op[0] == 'Q') printf("%d
    ",query(a , b , 1 , n , 1));
                         else update(a , b , 1 , n , 1);
                  }
           }
           return 0;
    }
  • 相关阅读:
    反转链表
    链表中倒数第k个结点
    调整数组顺序使奇数位于偶数前面
    词根词缀,非核心prefix/suffix/root
    核心过去式/过去完成时Past tense / past perfect
    非顺序表达
    英语连读
    图片,视频总结
    sql,explain
    @transaction注解
  • 原文地址:https://www.cnblogs.com/kls123/p/6824583.html
Copyright © 2011-2022 走看看