zoukankan      html  css  js  c++  java
  • hdu 1754(单点更新 ,区间最大值)

    I Hate It

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

    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<cstdio>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<algorithm>
     6 #include<queue>
     7 #include<map>
     8 #include<set>
     9 #include<vector>
    10 #include<cstdlib>
    11 #include<string>
    12 #define eps 0.000000001
    13 typedef long long ll;
    14 typedef unsigned long long LL;
    15 using namespace std;
    16 const int N=200000+100;
    17 struct node{
    18     int l,r;
    19     int val;
    20 }tree[N*4];
    21 void pushup(int pos){
    22     tree[pos].val=max(tree[pos<<1].val,tree[pos<<1|1].val);
    23 }
    24 void build(int l,int r,int pos){
    25     tree[pos].r=r;
    26     tree[pos].l=l;
    27     tree[pos].val=0;
    28     if(tree[pos].l==tree[pos].r){
    29         return;
    30     }
    31     int mid=(l+r)>>1;
    32     build(l,mid,pos<<1);
    33     build(mid+1,r,pos<<1|1);
    34     pushup(pos);
    35 }
    36 void update(int x,int y,int pos){
    37     if(tree[pos].l==x&&x==tree[pos].r){
    38         tree[pos].val=y;
    39         return;
    40     }
    41     int mid=(tree[pos].l+tree[pos].r)>>1;
    42     if(x>mid){
    43         update(x,y,pos<<1|1);
    44     }
    45     else{
    46         update(x,y,pos<<1);
    47     }
    48     pushup(pos);
    49 }
    50 int query(int x,int y,int pos){
    51     if(tree[pos].l>=x&&tree[pos].r<=y){
    52         return tree[pos].val;
    53     }
    54     int ans=0;
    55     int mid=(tree[pos].l+tree[pos].r)>>1;
    56     if(x<=mid){
    57         ans=max(ans,query(x,y,pos<<1));
    58     }
    59     if(y>mid){
    60         ans=max(ans,query(x,y,pos<<1|1));
    61     }
    62     return ans;
    63 }
    64 int main(){
    65     int m,n;
    66     while(scanf("%d%d",&n,&m)!=EOF){
    67         getchar();
    68         build(1,n,1);
    69         int x;
    70         for(int i=1;i<=n;i++){
    71             scanf("%d",&x);
    72             update(i,x,1);
    73         }
    74         char str[10];
    75         int a,b;
    76         int ans;
    77         while(m--){
    78             scanf("%s%d%d",str,&a,&b);
    79             //cout<<2<<endl;
    80             if(str[0]=='U'){
    81                 update(a,b,1);
    82             }
    83             else{
    84                  ans=query(a,b,1);
    85             printf("%d
    ",ans);
    86             }
    87         }
    88     }
    89 }
  • 相关阅读:
    Redis主从复制
    POI导出给指定单元格添加背景色
    Mybatis的resultMap使用
    前后端分离
    日常总结
    java环境变量配置
    Java线程池七个参数详解
    java中常见的锁
    Linux定时任务
    SQL语句的整理
  • 原文地址:https://www.cnblogs.com/Aa1039510121/p/6486042.html
Copyright © 2011-2022 走看看