• hdu 1754 I Hate It 单点更新 区间最值


    I Hate It

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


    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
     
    线段树单点更新,区间求值。
     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <string>
     5 #include <iomanip>
     6 #include <stdio.h>
     7 #include <algorithm>
     8 using namespace std;
     9 #define maxn 200020
    10 #define lson l,m,rt<<1
    11 #define rson m+1,r,rt<<1|1 
    12 int cnt[maxn<<2];
    13 int N, M;
    14 int max(int a, int b){
    15     return a>b?a:b;
    16 }
    17 void PushUP(int rt){
    18     cnt[rt] = max( cnt[rt<<1],cnt[rt<<1|1]); 
    19 }
    20 void build(int l, int r, int rt){
    21     if(l == r){
    22         scanf("%d", &cnt[rt]);
    23         return;
    24     }
    25     int m = (l+r)>>1;
    26     build(lson);
    27     build(rson);
    28     PushUP(rt);
    29 }
    30 void update(int p, int add, int l, int r, int rt){
    31     if(l == r){
    32         cnt[rt] = add;
    33         return;
    34     }
    35     int m = (l+r)>>1;
    36     if(p <= m) update(p, add, lson);
    37     else update(p, add, rson);
    38     PushUP(rt);
    39 }
    40 int query(int L, int R, int l, int r, int rt){
    41     if(L <= l && r <= R){
    42         return cnt[rt];
    43     }
    44     int m = (l+r)>>1;
    45     int ret = 0;
    46     if(L <= m) ret = max(ret,query(L, R, lson));
    47     if(R > m) ret = max(ret, query(L, R, rson));
    48     return ret;
    49 }
    50 int main(){
    51     while(~scanf("%d%d", &N, &M)){
    52         build(1, N, 1);
    53         while(M--){
    54             char c[2];
    55             scanf("%s", &c);
    56             int a, b; 
    57             scanf("%d%d", &a, &b);
    58             if(c[0] == 'Q') printf("%d
    ", query(a, b, 1, N, 1));
    59             else if(c[0] == 'U') update(a, b, 1, N, 1);
    60         }
    61     }
    62     return 0;
    63 }
  • 相关阅读:
    duilib入门简明教程 -- VS环境配置(2) Alberl
    使用libCurl实现断点下载
    通用选择器和高级选择器
    Aforge.net 一个专门为开发者和研究者基于C#框架设计
    iBatis核心框架浅析
    Parameter Binding in ASP.NET Web API(参数绑定)
    图的基本概念
    领域模型中分散的事务如何集中统一处理(C#解决方案)
    .NET 垃圾回收与内存泄漏
    三层架构之泛型抽象工厂
  • 原文地址:https://www.cnblogs.com/titicia/p/4453741.html
Copyright © 2020-2023  润新知