• I Hate It HDU


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

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

    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
            
     这题就略微的修改一下 线段树结构  入门级题目 水题
     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 #define maxn 200010
     7 int  sum[maxn*4+10];
     8 void pushup(int rt)
     9 {
    10     sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
    11 }
    12 void build(int l,int r,int rt)
    13 {
    14     if (l==r){
    15         scanf("%d",&sum[rt]);
    16         return ;
    17     }
    18     int m=(l+r)>>1;
    19     build(l,m,rt<<1);
    20     build(m+1,r,rt<<1|1);
    21     pushup(rt);
    22 }
    23 void updata(int c,int x,int l,int r,int rt)
    24 {
    25     if (l==r) {
    26         sum[rt]=c;
    27         return ;
    28     }
    29     int m=(l+r)>>1;
    30     if (x<=m) updata(c,x,l,m,rt<<1);
    31     if (x>m)  updata(c,x,m+1,r,rt<<1|1);
    32     pushup(rt);
    33 }
    34 int maxs(int x,int y,int l,int r,int rt)
    35 {
    36     int ans=0;
    37     if (x<=l && r<=y ) return sum[rt];
    38     int m=(l+r)>>1;
    39     if (x<=m) ans=max(ans,maxs(x,y,l,m,rt<<1));
    40     if (y>m)  ans=max(ans,maxs(x,y,m+1,r,rt<<1|1));
    41     return ans;
    42 }
    43 
    44 int main()
    45 {
    46     int n,m;
    47     while(scanf("%d%d",&n,&m)!=EOF){
    48         build(1,n,1);
    49         char b[2];
    50         int x,y;
    51         while(m--){
    52             scanf("%s%d%d",b,&x,&y);
    53             if (b[0]=='Q') printf("%d
    ",maxs(x,y,1,n,1));
    54             else updata(y,x,1,n,1);
    55         }
    56     }
    57     return 0;
    58 }


  • 相关阅读:
    [leetCode]剑指 Offer 62. 圆圈中最后剩下的数字
    [leetCode]剑指 Offer 61. 扑克牌中的顺子
    [leetCode]剑指 Offer 60. n个骰子的点数
    POJ
    POJ
    POJ
    codeforces
    LightOJ
    CodeForces
    CodeForces
  • 原文地址:https://www.cnblogs.com/qldabiaoge/p/8506394.html
Copyright © 2020-2023  润新知