zoukankan      html  css  js  c++  java
  • HDU 1754 I Hate It 【线段树单点修改 维护区间最大值】

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1754

    I Hate It

    Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 102825    Accepted Submission(s): 38669

    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
     
    Author
    linle

    解题思路:

    线段树裸题, 模板

    AC code:

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <algorithm>
     4 #include <cstring>
     5 #define MAXNODE 1<<19
     6 using namespace std;
     7 const int MAXN = 2e5+10;
     8 struct data
     9 {
    10     int l, r, value;
    11 }node[MAXNODE];
    12 int score[MAXN];
    13 int N, M;
    14 
    15 void BuildTree(int left, int right, int num)        //建树
    16 {
    17     node[num].l = left;
    18     node[num].r = right;
    19     if(left == right)
    20     {
    21         node[num].value = score[left];
    22     }
    23     else
    24     {
    25         BuildTree(left, (left+right)>>1, num<<1); //左子树
    26         BuildTree(((left+right)>>1)+1, right, (num<<1)+1); //右子树
    27         node[num].value = max(node[num<<1].value, node[(num<<1)+1].value);
    28     }
    29 }
    30 
    31 void Update(int stu, int val, int num)    //更新
    32 {
    33     node[num].value = max(val, node[num].value);
    34     if(node[num].l == node[num].r) return;  //更新到叶子结点
    35     if(stu <= node[num<<1].r)  Update(stu, val, num<<1);  //更新左子树
    36     else Update(stu, val, (num<<1)+1);      //更新右子树
    37 }
    38 
    39 int Query(int left, int right, int num)
    40 {
    41     if(node[num].l == left && node[num].r == right)  //区间恰好重合
    42         return node[num].value;
    43     if(right <= node[num<<1].r) //在左子树区间内
    44         return Query(left, right, num<<1);
    45     if(left >= node[(num<<1)+1].l) //在右子树区间内
    46         return Query(left, right, (num<<1)+1);
    47     int mid = (node[num].l + node[num].r)>>1;
    48     return max(Query(left, mid, num<<1), Query(mid+1, right, (num<<1)+1));
    49 }
    50 
    51 int main()
    52 {
    53 
    54     while(~scanf("%d%d", &N, &M))
    55     {
    56         for(int i = 1; i <= N; i++)
    57             scanf("%d", &score[i]);
    58         BuildTree(1, N, 1);
    59         char com[3];
    60         int a, b;
    61         while(M--)
    62         {
    63             scanf("%s", com);
    64             scanf("%d%d", &a, &b);
    65             if(com[0] == 'U')
    66             {
    67                 Update(a, b, 1);
    68             }
    69             else
    70             {
    71                 printf("%d
    ", Query(a, b, 1));
    72             }
    73         }
    74     }
    75     return 0;
    76 }
  • 相关阅读:
    华为机试题 成绩排名
    华为机试题 四则运算
    华为机试题 求最大连续bit数
    华为机试题 Redraiment
    华为机试题 素数伴侣
    华为机试题 字符串排序
    华为机试题 计算字符串的距离
    华为机试题 多线程
    UE4-快捷键-按键监听事件
    UE4-Blueprint Class-Actor-开关门-盒子触发体
  • 原文地址:https://www.cnblogs.com/ymzjj/p/9517879.html
Copyright © 2011-2022 走看看