zoukankan      html  css  js  c++  java
  • 【HDU1754】I hate it!

    题面

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

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

    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

    题解

    (洛谷上的题目略有不同)
    这道题目直接用线段树就可以解决
    我只是拿来学习一下zkw线段树
    具体的我也不知道为什么
    学会了再写

    //练习一下zkw线段树 
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    #define INF 200000000
    int M,n,m;
    int c[1<<20];
    void Build(int n)//建树 
    {
          for(M=1;M-2<n;M<<=1);
          for(int i=M+1;i<=M+n;++i)
             scanf("%d",&c[i]);
          for(int i=M;i;--i)
          {
             c[i]=max(c[i<<1],c[(i<<1)^1]);
             c[i<<1]-=c[i];
             c[(i<<1)^1]-=c[i];
          }
    }
    int Query(int l,int r)//查询操作 
    {
          int L=-INF,R=-INF;
          l+=M-1;r+=M+1;//换成开区间操作
          while(l^r^1)
          {
                 L+=c[l];R+=c[r];
                 if(~l&1)L=max(L,c[l+1]);
                 if(r&1) R=max(R,c[r-1]);
                 l>>=1;r>>=1;
          }
          L+=c[l];R+=c[r];
          int Ans=max(L,R);
          for(l>>=1;l;l>>=1)Ans+=c[l];
          return Ans;
    }
    void Change(int X,int w)//单点修改
    {
          X+=M;
          c[X]+=w-Query(X-M,X-M);
          for(X>>=1;X;X>>=1)
          {
             int A=max(c[X<<1],c[(X<<1)^1]);
             c[X<<1]-=A;
             c[(X<<1)^1]-=A;
             c[X]+=A;
          }
    }
    int main()
    {
                   scanf("%d%d",&n,&m);
                   memset(c,0,sizeof(c));
                   Build(n);
                   for(int i=1;i<=m;++i)
                   {
                            char ch;
                            int A,B;
                            cin>>ch;
                            scanf("%d%d",&A,&B);
                            if(ch=='U')//更新操作
                            {
                                   if(Query(A,A)<B)
                                   Change(A,B);
                            }
                         else
    			         printf("%d
    ",Query(A,B));
                   }
          }
          return 0;
    }
    
    
  • 相关阅读:
    在日志中记录Java异常信息的正确姿势
    基于Spring Boot架构的前后端完全分离项目API路径问题
    Spring生态简介
    WebSocket协议入门介绍
    Spring Boot程序正确停止的姿势
    python 中 __init__方法
    python中的if __name__ == 'main'
    python 类和实例
    内建模块 datetime使用
    内建模块collections的使用
  • 原文地址:https://www.cnblogs.com/cjyyb/p/7223138.html
Copyright © 2011-2022 走看看