zoukankan      html  css  js  c++  java
  • I Hate It 线段树

    Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

    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 
     
     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 int n,m,a[200005],ma[600005],id,ad,ql,qr;
     7 
     8 void build(int o,int l,int r)
     9 {
    10     if(l==r){
    11         ma[o]=a[l];
    12         return;
    13     }
    14     int mid=(l+r)/2;
    15     build(o*2,l,mid);
    16     build(o*2+1,mid+1,r);
    17     ma[o]=max(ma[o*2],ma[o*2+1]);
    18 }
    19 
    20 void update(int o,int l,int r)
    21 {
    22     if(l==r){
    23         if(l==id){
    24             a[l]=ad;
    25             ma[o]=ad;
    26         }
    27         return;
    28     }
    29     int mid=(l+r)/2;
    30     if(id<=mid){
    31         update(o*2,l,mid);
    32     }
    33     else{
    34         update(o*2+1,mid+1,r);
    35     }
    36     ma[o]=max(ma[o*2],ma[o*2+1]);
    37 }
    38 
    39 int quary(int o,int l,int r)
    40 {
    41     if(ql<=l && qr>=r)
    42         return ma[o];
    43     int mid=(l+r)/2;
    44     int ans1=0,ans2=0;
    45     if(ql<=mid){
    46         ans1=quary(o*2,l,mid);
    47     }
    48     if(qr>mid){
    49         ans2=quary(o*2+1,mid+1,r);
    50     }
    51     return max(ans1,ans2);
    52 }
    53 
    54 int main()
    55 {
    56     int i,j,k,x,y;
    57     char str[10];
    58     while(scanf("%d %d",&n,&m)!=EOF)
    59     {
    60         memset(ma,0,sizeof(ma));
    61         for(i=1;i<=n;i++)
    62             scanf("%d",&a[i]);
    63         build(1,1,n);
    64         while(m--)
    65         {
    66             scanf("%s",str);
    67             scanf("%d %d",&x,&y);
    68             if(str[0]=='Q')
    69             {
    70                 ql=x,qr=y;
    71                 printf("%d
    ",quary(1,1,n));
    72             }
    73             else if(str[0]=='U')
    74             {
    75                 id=x,ad=y;
    76                 update(1,1,n);
    77             }
    78         }
    79     }
    80     return 0;
    81 }
    View Code
  • 相关阅读:
    [UE4]蓝图中清空变量值或设置为null
    [UE4]运行时脱离视角,进入自由视角
    [UE4]扔枪
    [UE4]反射
    为帮助保护你的安全,您的Web浏览器已经限制此文件显示可能访问您的计算机的活动内容
    [UE4]根据名字调用函数(蓝图)
    [UE4]移除UI(User Widget)并销毁
    [UE4]Return Node节点好用法
    [UE4]关于分支Sequence和条件分支的组合用法
    [UE4]隐藏对象Set Visibility
  • 原文地址:https://www.cnblogs.com/cyd308/p/4734664.html
Copyright © 2011-2022 走看看