• B


    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
    分析:与上一道敌兵布阵差不多不过节点信息保存区间成绩最好的那个同学就可以了
    ************************************************************************
    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;

    #define maxn 200005
    #define Lson root<<1,L,tree[root].Mid()
    #define Rson root<<1|1,tree[root].Mid()+1,R

    struct TreeNode
    {//bestMark保存LR区间最好的成绩
        int bestMark, L, R;
        int Mid(){return (L+R)/2;}
    }tree[maxn*4];
    int Mart[maxn];//保存所有学生的成绩

    void Build(int root, int L, int R)
    {
        tree[root].L = L, tree[root].R = R;

        if(L == R)
        {
            tree[root].bestMark = Mart[L];
            return ;
        }

        Build(Lson);
        Build(Rson);

        tree[root].bestMark = max(tree[root<<1].bestMark, tree[root<<1|1].bestMark);
    }
    //使k点的成绩变为e
    void Insert(int root, int k, int e)
    {
        tree[root].bestMark = max(tree[root].bestMark, e);

        if(tree[root].L == tree[root].R)
            return ;

        if(k <= tree[root].Mid())
            Insert(root<<1, k, e);
        else
            Insert(root<<1|1, k, e);
    }
    //查询区间LR最好的成绩
    int  Query(int root, int L, int R)
    {
        if(tree[root].L == L && tree[root].R == R)
            return tree[root].bestMark;

        if(R <= tree[root].Mid())
            return Query(root<<1, L, R);
        else if(L > tree[root].Mid())
            return Query(root<<1|1, L, R);
        else
            return max(Query(Lson), Query(Rson));
    }

    int main()
    {
        int i, N, M;

        while(scanf("%d%d", &N, &M) != EOF)
        {
            for(i=1; i<=N; i++)
                scanf("%d", &Mart[i]);
            Build(11, N);

            int x, y; char s[10];

            while(M--)
            {
                scanf("%s%d%d", s, &x, &y);
                if(s[0] == 'U')
                    Insert(1, x, y);
                else
                {
                    int ans = Query(1, x, y);
                    printf("%d ", ans);
                }
            }
        }

        return 0;
    }
  • 相关阅读:
    洛谷 P2872 [USACO07DEC]道路建设Building Roads
    cogs 29. 公路建设
    cogs 7. 通信线路
    cogs 2478. [HZOI 2016]简单的最近公共祖先
    洛谷 P1342 请柬
    洛谷 P1186 玛丽卡
    洛谷 P1491 集合位置
    启动、停止、重启服务
    洛谷——P1025 数的划分
    洛谷——P3368 【模板】树状数组 2
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4677522.html
Copyright © 2020-2023  润新知