zoukankan      html  css  js  c++  java
  • 洛谷1198 JSOI2008最大数 线段树版

    传送门:https://www.luogu.org/problem/show?pid=1198

    题目描述

    现在请求你维护一个数列,要求提供以下两种操作:

    1、 查询操作。

    语法:Q L

    功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值。

    限制:L不超过当前数列的长度。

    2、 插入操作。

    语法:A n

    功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾。

    限制:n是整数(可能为负数)并且在长整范围内。

    注意:初始时数列是空的,没有一个数。

    输入格式

    第一行两个整数,M和D,其中M表示操作的个数(M <= 200,000),D如上文中所述,满足(0<D<2,000,000,000)

    接下来的M行,每行一个字符串,描述一个具体的操作。语法如上文所述。

    输出格式

    对于每一个查询操作,你应该按照顺序依次输出结果,每个结果占一行。

    样例君

      输入

    5 100
    A 96
    Q 1
    A 97
    Q 1
    Q 2

    输出

      96
      93
      96

    蒟蒻吐槽

      这道题还可以用单调栈做,但是蒟蒻头不行,还是直接翻译题目吧,题目一目了然,就是先建一棵空的线段树,然后慢慢进行操作就可以了,A就是单点修改,Q就是区间查询。由于在最后插入值,比较麻烦,所以我们可以处理一下当前的数列末尾编号,在程序中就是那个n,查询区间就是n到(n-L+1)。

       关于这道题的其他收获,我觉得最大的就是scanf(" %c%d",&ch,&v);这句话吧,注意%c前有一个空格,就可以避免输入时多出来的‘ ’啦,空格啦之类东西的干扰。代码附上,请各位看官老爷不要嫌弃哈。

    代码

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    #define LL long long
    
    const int N=200010;
    const int inf=2147483646;
    
    char ch;
    int tr[N*4],ql,qr,m,mod,n,v,mm;
    
    inline void update(int o,int l,int r)
    {
        if(ql==l&&qr==r)
        {
            tr[o]+=v;
            return;
        }
        int mid=(l+r)>>1;
        if(ql<=mid)update(o<<1,l,mid);
        if(qr>mid)update(o<<1|1,mid+1,r);
        tr[o]=max(tr[o],max(tr[o<<1],tr[o<<1|1]));
    }
    
    inline int query(int o,int l,int r)
    {
        if(ql<=l&&qr>=r)return tr[o];
        int mid=(l+r)>>1,ans=-inf;
        if(ql<=mid)ans=query(o<<1,l,mid);
        if(qr>mid)ans=max(ans,query(o<<1|1,mid+1,r));
        return ans;
    }
    
    int main()
    {
        int ans=0;
        scanf("%d%d",&m,&mod);
        mm=m; 
        while(mm--)
        {
            scanf(" %c%d",&ch,&v);
            if(ch=='A')
            {
                v=(v+ans)%mod;
                n++;
                ql=qr=n;
                update(1,1,m);
            }
            else
            {
                qr=n;ql=n-v+1;
                ans=query(1,1,m);
                printf("%d
    ",ans);
            }
        }
        return 0;
    }
  • 相关阅读:
    面试试题
    使用NSURLSessionDataTask请求数据(get post方式)
    使用SSZipArchive第三方库解压zip包
    实现图文混编界面
    使用多线程创建单例对象
    SQL语句的种类_外键_表连接(内连接和左外连接)
    使用第三方库(FMDB) 本地数据库存储数据 --使用为了保证线程安全做法
    利用第三方库XML解析 (TBXML)转化成模型数据
    蓝牙传送_多点连接 (适用于>iOS7)
    Unity 产生各不相同的随机数
  • 原文地址:https://www.cnblogs.com/mofangk/p/7732202.html
Copyright © 2011-2022 走看看