• P1531 I Hate It


    题目背景

    很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。这让很多学生很反感。

    题目描述

    不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩

    输入输出格式

    输入格式:

    第一行,有两个正整数 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'的时候,表示这是一条更新操作,如果当前A学生的成绩低于B,则把ID为A的学生的成绩更改为B,否则不改动。

    输出格式:

    对于每一次询问操作,在一行里面输出最高成绩

    输入输出样例

    输入样例#1:
    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
    输出样例#1:
    5
    6
    5
    9

    线段树区间查询+单点修改

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<queue>
     6 #include<algorithm>
     7 #define ls k<<1
     8 #define rs k<<1|1
     9 using namespace std;
    10 const int MAXN=2000001;
    11 void read(int &n)
    12 {
    13     char c='+';int x=0;bool flag=0;
    14     while(c<'0'||c>'9')
    15     {c=getchar();if(c=='-')flag=1;}
    16     while(c>='0'&&c<='9')
    17     {x=x*10+c-48,c=getchar();}
    18     flag==1?n=-x:n=x;
    19 }
    20 int n,m;
    21 int ans=-1;
    22 struct node
    23 {
    24     int l,r,w;
    25 }tree[MAXN*4];
    26 void update(int k)
    27 {
    28     tree[k].w=max(tree[ls].w,tree[rs].w);
    29 }
    30 void build_tree(int ll,int rr,int k)
    31 {
    32     tree[k].l=ll;tree[k].r=rr;
    33     if(ll==rr)
    34     {
    35         read(tree[k].w);
    36         return ;
    37     }
    38     int mid=(ll+rr)>>1;
    39     build_tree(ll,mid,ls);
    40     build_tree(mid+1,rr,rs);
    41     update(k);
    42 }
    43 void query(int ll,int rr,int k)
    44 {
    45     if(ll>tree[k].r||rr<tree[k].l)
    46         return ;
    47     if(ll<=tree[k].l&&tree[k].r<=rr)
    48     {
    49         ans=max(ans,tree[k].w);
    50         return ;
    51     }
    52     int mid=(tree[k].l+tree[k].r)>>1;
    53     query(ll,rr,ls);
    54     query(ll,rr,rs);
    55 }
    56 void change(int pos,int v,int k)
    57 {
    58     if(pos>tree[k].r||pos<tree[k].l)
    59         return ;
    60     if(tree[k].l==tree[k].r)
    61     {
    62         tree[k].w=v;
    63         return ;
    64     }
    65     change(pos,v,ls);
    66     change(pos,v,rs);
    67     update(k);
    68 }
    69 int main()
    70 {
    71     read(n);read(m);
    72     build_tree(1,n,1);
    73     for(int i=1;i<=m;i++)
    74     {
    75         string s;
    76         cin>>s;
    77         if(s[0]=='Q')// 查询
    78         {
    79             int l,r;
    80             read(l);read(r);
    81             ans=0;
    82             query(l,r,1);
    83             printf("%d
    ",ans);
    84         } 
    85         else 
    86         {
    87             int x,y;
    88             read(x);read(y);
    89             ans=0;
    90             query(x,x,1);
    91             if(ans<y)
    92             change(x,y,1);
    93         }
    94     }
    95     return 0;
    96 } 
     
  • 相关阅读:
    ZooKeeper的工作原理
    redis 数据类型详解 以及 redis适用场景场合
    nginx负载均衡原理
    Java中缓存的介绍
    Java中接口的作用
    json与xml的区别
    最经典40个多线程问题总结
    Java线程 : 线程同步与锁
    dbcp与c3p0的区别
    Linux常见命令
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/7137570.html
Copyright © 2020-2023  润新知