★★   输入文件:bzoj_1012.in   输出文件:bzoj_1012.out   简单对比
时间限制:3 s   内存限制:162 MB

【题目描述】

现在请求你维护一个数列,要求提供以下两种操作: 1、 查询操作。语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值。限制:L不超过当前数列的长度。 2、 插入操作。语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾。限制:n是非负整数并且在长整范围内。注意:初始时数列是空的,没有一个数。

【输入格式】

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

【输出格式】

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

【样例输入】

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

【样例输出】

96
93
96

【题目来源】

耒阳大视野(衡阳八中) OJ 1012

方法一 线段树 单点修改 RMQ

方法二 维护一个单调栈

屠龙宝刀点击就送

#include <cstdio>
#define Max 200000 typedef long long LL;
struct node
{
LL Maxn,l,r,dis;
}tr[Max<<];
LL M,D,pos=,t=;
LL max(LL a,LL b)
{
return a>b?a:b;
}
void up(LL k)
{
tr[k].Maxn=max(tr[k<<].Maxn,tr[k<<|].Maxn);
}
void build(LL k,LL l,LL r)
{
tr[k].l=l;
tr[k].r=r;
if(l==r)
{
tr[k].dis=;tr[k].Maxn=;
return;
}
LL mid=(l+r)>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
up(k);
}
void add(LL k,LL t,LL v)
{
if(tr[k].l==tr[k].r)
{
tr[k].dis+=v;
tr[k].Maxn=tr[k].dis;
return;
}
LL mid=(tr[k].l+tr[k].r)>>;
if(mid>=t) add(k<<,t,v);
else add(k<<|,t,v);
up(k);
}
LL query(LL k,LL l,LL r)
{
if(tr[k].l==l&&tr[k].r==r)
return tr[k].Maxn;
LL mid=(tr[k].l+tr[k].r)>>;
if(l>mid) return query(k<<|,l,r);
else if(r<=mid) return query(k<<,l,r);
else return max(query(k<<,l,mid),query(k<<|,mid+,r));
}
int main()
{
scanf("%lld%lld",&M,&D);
build(,,M);
char str[];
for(LL x;M--;)
{
scanf("%s",str+);
switch(str[])
{
case 'A':
{
scanf("%lld",&x);
add(,++pos,(x+t)%D);
break;
}
case 'Q':
{
scanf("%lld",&x);
t=query(,pos-x+,pos);
printf("%lld\n",t);
break;
}
}
}
return ;
}

线段树

#include <bits/stdc++.h>
using namespace std;
#define N 200005
typedef long long LL; void read(LL &x)
{
x=;bool f=;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-') f=;
ch=getchar();
}
while(isdigit(ch))
{
x=x*+ch-'';
ch=getchar();
}
x=f?(~x)+:x;
}
LL Num[N],s[N],top,cnt,a[N],M,D,t=;
int main()
{
read(M);
read(D);
char str[];
for(LL x;M--;)
{
scanf("%s",str+);
switch(str[])
{
case 'A':
{
scanf("%lld",&x);
LL y=(x+t)%D;
a[++cnt]=y;
while(top&&a[s[top]]<=y) top--;
s[++top]=cnt;
break;
}
case 'Q':
{
scanf("%lld",&x);
int l=,r=top;
while(l<r)
{
int mid=(l+r)>>;
if(s[mid]<cnt-x+) l=mid+;
else r=mid;
}
int y=l;
t=a[s[l]];
printf("%lld\n",a[s[y]]);
break;
}
}
}
return ;
}

单调栈

BZOJ 1012: [JSOI2008]最大数maxnumber的更多相关文章

  1. BZOJ 1012: [JSOI2008]最大数maxnumber【线段树单点更新求最值,单调队列,多解】

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 10374  Solved: 4535[Subm ...

  2. bzoj 1012: [JSOI2008]最大数maxnumber (线段树)

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 13081  Solved: 5654[Subm ...

  3. BZOJ 1012: [JSOI2008]最大数maxnumber 单调队列/线段树/树状数组/乱搞

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 4750  Solved: 2145[Submi ...

  4. BZOJ——1012: [JSOI2008]最大数maxnumber || 洛谷—— P1198 [JSOI2008]最大数

    http://www.lydsy.com/JudgeOnline/problem.php?id=1012|| https://www.luogu.org/problem/show?pid=1198 T ...

  5. bzoj 1012 [JSOI2008]最大数maxnumber

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1012 线段树,单点更新.. #include<algorithm> #incl ...

  6. BZOJ 1012: [JSOI2008]最大数maxnumber 线段树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1012 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作.语法:Q L 功能: ...

  7. BZOJ 1012 [JSOI2008]最大数maxnumber【线段树】

    水题,每次记录一下当前有多少个数,然后按照题目所指示的那样模拟就行,每次向线段树末尾插入(其实是修改)题目中指定的数,然后询问当前的个数到前面Q个数中最大值是多少结果就是,好久不碰线段树了,用数组模拟 ...

  8. 【单调队列+二分查找】bzoj 1012: [JSOI2008]最大数maxnumber

    [题意] 维护一个单调递减的q数组,用id数组记录q数组的每个下标对应在原数组的位置,那么id数组一定有单调性(q数组中越靠后,原数组中也靠后),然后二分查找这个数 [AC] #include< ...

  9. 大视野 1012: [JSOI2008]最大数maxnumber(线段树/ 树状数组/ 单调队列/ 单调栈/ rmq)

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 9851  Solved: 4318[Submi ...

  10. bzoj-1012 1012: [JSOI2008]最大数maxnumber(线段树)

    题目链接: 1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MB Description 现在请求你维护一个数列,要 ...

随机推荐

  1. Unbuntu 终端中使用Tab键不能自动补全

    解决方案 1.利用vi编辑器打开 /etc/bash.bashrc文件(需要root权限) sudo vi /etc/bash.bashrc 2.找到文件中的下列代码 #enable bash com ...

  2. UILabel 常见问题总结

    写在前面:笔者在iOS软件开发中发现UILabel控件有些问题反复出现,所以在这里做点总结,方便自己查阅,也能给大家提供相关问题的解决方案. 一:当label里的内容显示满了的时候,能够自动将字体变小 ...

  3. Python的多进程锁的使用

    很多时候,我们需要在多个进程中同时写一个文件,如果不加锁机制,就会导致写文件错乱 这个时候,我们可以使用multiprocessing.Lock() 我一开始是这样使用的: import multip ...

  4. cas单点登录系统:客户端(client)详细配置(包含统一单点注销配置)

    最近一直在研究cas登录中心这一块的应用,分享一下记录的一些笔记和心得.后面会把cas-server端的配置和重构,另外还有这几天再搞nginx+cas的https反向代理配置,以及cas的证书相关的 ...

  5. js、匿名函数、闭包、回调函数

    234567891011121314151617181920212223242526272829303132333435 闭包 闭包:闭包是指有权访问另一个函数作用域中的变量的函数 函数嵌套一个函数, ...

  6. 更新gitignore

    更新: 2017/04/26  修正windows版本下的命令   git rm -r --cached .       (Windows 下的版本) 更新: 2017/06/06  mac下的命令也 ...

  7. C++开发工程师面试题库 1~50道

    1.    指出以下变量数据存储位置 全局变量int(*g_pFun)(int);g_pFun=myFunction;g_pFun存储的位置(A ) 为全局的函数指针 指向空间的位置( B) 所有函数 ...

  8. hdoj3665【简单DFS】

    题意: 略. 思路: n就10而已,没有环,搜一下就好了.. #include <bits/stdc++.h> using namespace std; typedef long long ...

  9. 序列/树上差分小结 By cellur925

    首先我们需要注意一下的是,差分比较适用于修改比较多而查询比较少的情况. 一.序列上差分 借教室  这是一道二分答案,在check函数中用到差分技巧的一道题,譬如说我们要把一个序列中[l,r]区间都加上 ...

  10. 最短路之Floyd(弗洛伊德)

    只有五行的Floyd最短路算法: 核心代码 每次都更新通过k点,然后从i到j的最短路程...