• 【线段树】HDU1754: I Hate It


    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 <string>
     3 #include <cstdio>
     4 #include <algorithm>
     5 #include <string.h>
     6 #define inf 0x3f3f3f3f
     7 #define met(a,b) memset(a,b,sizeof a)
     8 #define pb push_back
     9 #define mp make_pair
    10 #define rep(i,l,r) for(int i=(l);i<=(r);++i)
    11 #define inf 0x3f3f3f3f
    12 using namespace std;
    13 typedef long long ll;
    14 const int N = 2e5+50;;
    15 int n,m;
    16 int mx[N*4],a[N];
    17 void pushUp(int rt){
    18     mx[rt]=max(mx[rt*2],mx[rt*2+1]);
    19 }
    20 void build(int l,int r,int rt){
    21     if(l==r){
    22         mx[rt]=a[l];
    23         return;
    24     }
    25     int mid=(l+r)/2;
    26     build(l,mid,rt*2);
    27     build(mid+1,r,rt*2+1);
    28     pushUp(rt);
    29 }
    30 void update(int pos,int val,int l,int r,int rt){
    31     if(l==r){
    32         mx[rt]=val;
    33         return;
    34     }
    35     int mid=(l+r)/2;
    36     if(pos<=mid)update(pos,val,l,mid,rt*2);
    37     else update(pos,val,mid+1,r,rt*2+1);
    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 mx[rt];
    43     }
    44     int mid=(l+r)/2;
    45     int ret=0;
    46     if (L <= mid) ret = max(ret,query(L,R ,l,mid,rt*2));
    47     if (R > mid) ret = max(ret,query(L,R,mid+1,r,rt*2+1));
    48     return ret;
    49 }
    50 int main() {
    51     while(~scanf("%d%d",&n,&m)){
    52         for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    53         build(1,n,1);
    54         while(m--){
    55             char op[2];
    56             int x,y;
    57             scanf("%s%d%d",op,&x,&y);
    58             if(op[0]=='Q')printf("%d
    ",query(x,y,1,n,1));
    59             else update(x,y,1,n,1);
    60         }
    61     }
    62     return 0;
    63 }
    View Code


  • 相关阅读:
    安卓客户端获取手机号码
    安卓自定义控件之设计自己的提示dialog
    一步步打造自己的分页控件4
    C#winform小游戏之贪吃蛇重温C#
    android观察者模式
    Android开发之Java设计模式
    Android 用Animationlist实现逐帧动画
    图片压缩
    Android使用缓存优化ListView
    Android命令行启动程序正确使用技巧解析
  • 原文地址:https://www.cnblogs.com/SoulSecret/p/8375747.html
Copyright © 2020-2023  润新知