• HDU--1754 I Hate It


    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
    Hint
    Huge input,the C function scanf() will work better than cin
    思路:就是线段树,就是求和变成了求最大值
    AC代码:
     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 using namespace std;
     5 //struct Vote1   用的结构体,到第三组数据就出错..不知道为什么 
     6 //{
     7 //    char c[3];
     8 //    int std;
     9 //    int endd;
    10 //}p[5000+5];
    11 struct tree
    12 {
    13     int maxx,l,r;
    14 }q[200005*4];
    15 void Pushup(int o)
    16 {
    17     q[o].maxx=max(q[o*2].maxx,q[o*2+1].maxx);
    18 }
    19 void Build(int o,int l,int r)
    20 {
    21     q[o].l=l;
    22     q[o].r=r;
    23     if(l==r)
    24     {
    25         int t;
    26         scanf("%d",&t);
    27         q[o].maxx=t;
    28         return;    
    29     }
    30     int mid=(l+r)/2;
    31     Build(o*2,l,mid);
    32     Build(o*2+1,mid+1,r);
    33     Pushup(o);    
    34         
    35 }
    36 void Update(int o,int l,int r,int x,int y)
    37 {
    38     if(l==r)
    39     {
    40         q[o].maxx=y;
    41         return;
    42     }
    43     int mid=(l+r)/2;
    44     if(x<=mid)
    45         Update(o*2,l,mid,x,y);
    46     else
    47         Update(o*2+1,mid+1,r,x,y);
    48     Pushup(o);            
    49         
    50 }
    51 int Querysum(int o,int l,int r,int x,int y)
    52 {
    53     if(l==x&&r==y)
    54         return q[o].maxx;
    55     int mid=(l+r)/2;
    56     if(y<=mid)
    57         return Querysum(o*2,l,mid,x,y);
    58     else if(x>mid)
    59         return Querysum(o*2+1,mid+1,r,x,y);
    60     else 
    61         return max(Querysum(o*2,l,mid,x,mid),Querysum(o*2+1,mid+1,r,mid+1,y));            
    62 }
    63 
    64 int main()
    65 {
    66     int n,m;
    67     while(~scanf("%d %d",&n,&m))
    68     {
    69         Build(1,1,n); 
    70         char c[3];//  把结构体里的变量分别定义,就对了,也是醉了 
    71         int x,y;   //  难道一个程序里面只能定义一个结构体??? 
    72         for(int i=0;i<m;i++)
    73         {
    74             scanf("%s %d %d",c,&x,&y);
    75             if(c[0]=='Q')
    76                 printf("%d
    ",Querysum(1,1,n,x,y));
    77             else
    78                 Update(1,1,n,x,y);
    79             
    80                 
    81         }    
    82     }
    83     return 0;
    84 }
  • 相关阅读:
    Django REST framework
    SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)
    zipfile 解压文件名乱码
    Django开发BUG汇总
    [Java 并发] AQS 是个啥?
    [碎碎念]来水一篇
    [Java 并发]深入浅出 synchronized 与锁
    [Java 并发]你确定你了解 volatile ?
    [Java 并发]为什么会有重排序?和 happens-before 有啥关系
    [Java 并发]带你从源码解读线程组( ThreadGroup )好不好
  • 原文地址:https://www.cnblogs.com/hss-521/p/7381778.html
Copyright © 2020-2023  润新知