zoukankan      html  css  js  c++  java
  • 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<cmath>
     4 using namespace std;
     5 
     6 
     7 const int MAXN = 200005;
     8 int N ,M;
     9 int a[MAXN];
    10 int tree[MAXN*4];
    11 string s ;
    12 int x , y;
    13 void bulid_tree(int l ,int r ,int tr)
    14 {
    15     if(l==r)
    16     {
    17         tree[tr] = a[l];
    18         return ;
    19     }
    20     int m = (l+r)/2;
    21     
    22     bulid_tree(l,m,tr*2);
    23     bulid_tree(m+1,r,tr*2+1);
    24     tree[tr] = max(tree[tr*2],tree[tr*2+1]);
    25 }
    26 int Query(int x ,int y ,int l , int r ,int tr)
    27 {
    28     int ans = 0;
    29     if(l>=x&&r<=y)
    30     {
    31         return tree[tr];
    32     }
    33     int m = (l+r)/2;
    34     
    35     if(m>=x)
    36     {
    37         ans = max(ans,Query(x,y,l,m,tr*2));
    38         
    39     }
    40     if(m<y)
    41     {
    42         ans = max(ans,Query(x,y,m+1,r,tr*2+1));
    43     }
    44     return ans;
    45 
    46 }
    47 void Update(int x ,int value, int l , int r ,int tr)
    48 {
    49     if(l==r)
    50     {
    51         tree[tr] = value;
    52         return ;
    53     }
    54     int m = (l+r)/2;
    55     
    56     if(x<=m)
    57     {
    58         Update(x,value,l,m,tr*2);
    59     }
    60     if(m<x)
    61     {
    62         Update(x,value,m+1,r,tr*2+1);
    63     }
    64     tree[tr] = max(tree[tr*2],tree[tr*2+1]);
    65 }
    66 int main()
    67 {
    68     while(scanf("%d%d",&N,&M)!=EOF)
    69     {
    70         for(int i = 1 ; i <= N; i++)
    71         {
    72             scanf("%d",&a[i]);
    73         }
    74         bulid_tree(1,N,1);
    75         while(M--)
    76         {
    77             cin>>s;
    78             if(s[0]=='Q')
    79             {
    80                 scanf("%d%d",&x,&y);
    81                 printf("%d
    ",Query(x,y,1,N,1));
    82             }
    83             else
    84             if(s[0]=='U')
    85             {
    86                 scanf("%d%d",&x,&y);
    87                 Update(x,y,1,N,1);
    88             }
    89         }
    90     }
    91     return 0;
    92 }
  • 相关阅读:
    C 习题
    gcc
    几何视角看线性方程组解的情况
    JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
    为什么重写了equals(),还要重写hashCode()?
    关于ArrayList的越界问题?
    通过实例聊聊Java中的多态
    java异常处理实例分析
    Java: Integer用==比较时127相等128不相等的原因
    Java并发编程:Lock
  • 原文地址:https://www.cnblogs.com/yewanting/p/10800231.html
Copyright © 2011-2022 走看看