• 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
    

    对线段树的一个小修改,从求区间和变成了求区间最大值

    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int aa[800005];
    void build(int l,int r,int k)
    {
        if(l==r)
        {
            scanf("%d",&aa[k]);
        }
        else{
            int m=(l+r)>>1;
            build(l,m,k<<1);
            build(m+1,r,k<<1|1);
            aa[k]=max(aa[k<<1],aa[k<<1|1]);
        }
    }
    void update(int p,int add,int l,int r,int k)
    {
        if(l==r)
        {
            aa[k]=add;
        }
        else
        {
            int mid=(l+r)>>1;
            if(p<=mid) update(p,add,l,mid,k<<1);
            else update(p,add,mid+1,r,k<<1|1);
            aa[k]=max(aa[k<<1],aa[k<<1|1]);
        }
    }
    int query(int x,int y,int l,int r,int k)
    {
        if(x<=l&&r<=y)
        {
            return aa[k];
        }
        else
        {
            int sum=0;
            int m=(l+r)>>1;
            if(x<=m) sum=max(sum,query(x,y,l,m,k<<1));
            if(y>m) sum=max(sum,query(x,y,m+1,r,k<<1|1));
            return sum;
        }
    }
    int main()
    {
         int n,m;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            build(1,n,1);
            while(m--)
            {
                 char o[3];
                int x,y;
                scanf("%s%d%d",o,&x,&y);
                if(o[0]=='U')
                    update(x,y,1,n,1);
                else
                    printf("%d
    ",query(x,y,1,n,1));
            }
        }
    }
  • 相关阅读:
    黄金眼游戏
    四则运算
    关于构建之法的一些问题
    WorkConter
    python 列表构造时的引用问题
    网站前端求职的经历记录
    弱类型语言、强类型语言?
    关于JAVA的Random类的冷知识(转自菜鸟V)
    节后大礼包!XSql 源码开放,插件源码开放,Sofire v1.6 源码开放(已上传)
    【转】ASP.NET 尖括号 百分号 井号 等号 的用法
  • 原文地址:https://www.cnblogs.com/wpbing/p/9509338.html
Copyright © 2020-2023  润新知