zoukankan      html  css  js  c++  java
  • [JSOI2008]最大数 (线段树)

    题目描述

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

    1、 查询操作。

    语法:Q L

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

    限制:L不超过当前数列的长度。(L>=0)

    2、 插入操作。

    语法:A n

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

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

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

    输入输出格式

    输入格式:

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

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

    输出格式:

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

    输入输出样例

    输入样例#1: 
    5 100
    A 96
    Q 1
    A 97
    Q 1
    Q 2
    
    输出样例#1: 
    96
    93
    96
    

    说明

    [JSOI2008]

    本题数据已加强

    Solution

    线段树裸题,不解释.

    只是有一个坑点,就是不能在线处理,需要分部处理,否则修改的区间会不正确.

    代码

    #include<bits/stdc++.h>
    #define ll(x) x*2
    #define rr(x) x*2+1
    using namespace std;
    const int maxn=200008;
    int sgm[maxn*4],now;
    int c[maxn],num,nn,m,mo;
    struct sj{
        int x,pd;
    }a[maxn];
    
    int in(int node,int l,int r,int id,int x)
    {
        int dist=(l+r)/2;
        if(l!=r)
        {
            if(dist<id)in(rr(node),dist+1,r,id,x);
            else
            in(ll(node),l,dist,id,x);
        }
        sgm[node]=max(sgm[node],x);
    }
    
    int check(int node,int left,int right,int l,int r)
    {
        int ans=-1;
        if(l>right||r<left)
          return 0;
        if(right<=r&&left>=l)
          return sgm[node];
        int dist=(left+right)/2;
        ans=max(ans,check(ll(node),left,dist,l,r));
        ans=max(ans,check(rr(node),dist+1,right,l,r));
        return ans;
    }
    
    int main()
    {
        scanf("%d%d",&m,&mo);
        for(int i=1;i<=m;i++)
        {
            char pd; cin>>pd;
            scanf("%d",&a[i].x);
            if(pd=='A') a[i].pd=1,num++;
            else a[i].pd=0;
        }
        for(int i=1;i<=m;i++)
        {
            if(a[i].pd==1)
            in(1,1,num,++nn,(now+a[i].x)%mo);
            else
            {
                now=check(1,1,num,nn-a[i].x+1,nn);
                cout<<now<<endl;
            }
        }    
        return 0;
    }
  • 相关阅读:
    Log4j appender、layout
    EhCache缓存框架的使用
    Log4j rootLogger根配置以及4种日志级别
    开发chrome 插件, background.js中 console log 看不到解决方法
    Windows cmd 长时间不输出新内容 直到按下ctrl + c 取消或者回车的解决办法
    如何查看当前分支从哪个支线创建而来
    C# 获取相对路径的字符串
    解决adobe air sdk打包 apk后自动在包名前面加上air. (有个点)前缀的问题
    sublime text 输入法候选词不跟随光标
    Windows 批处理设置dns ,解决能上qq不能开网页
  • 原文地址:https://www.cnblogs.com/Kv-Stalin/p/9074274.html
Copyright © 2011-2022 走看看