★★   输入文件: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. [Selenium] The most commonly used CSSSelector

    CSSSelector Example Description element.element div.dropdown Select all  <div> elements whose ...

  2. windows下安装RabbitMQ消息服务器 + 读写队列

    RabbitMQ是什么 ? RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. 1:安装RabbitMQ需要先安装Erla ...

  3. Asp.net MVC 中使用 Ninject 实现依赖注入

    松耦合.针对抽象编程.不针对实现编程是面向对象设计的原则.依赖注入就是,在一个类的内部,不通过创建对象的实例而能够获得实现了某个公开接口的对象引用.所谓的控制反转也是相同的意思.把依赖的创建转移到了使 ...

  4. django上课笔记4-复习数据库操作-复习模板-Seccion-详细cookie和session的区别

    一.复习数据库操作 字段类型 字符串 EmailField(CharField): IPAddressField(Field) URLField(CharField) SlugField(CharFi ...

  5. 关于js变量作用域

    先来看一段代码 var ss=1;function sss(){ alert(ss);}$(document).ready(function(){ var ss=2; alert(ss); sss() ...

  6. bzoj 3053: The Closest M Points【KD-tree】

    多维KDtree板子 左右儿子的估价用mn~mx当区间,假设区间里的数都存在:k维轮着做割点 #include<iostream> #include<cstdio> #incl ...

  7. P4171 [JSOI2010]满汉全席(2-SAT)

    传送门 2-SAT裸题 把每一道菜拆成两个点分别表示用汉式或满式 连边可以参考板子->这里 然后最尴尬的是我没发现$n<=100$然后化成整数的时候只考虑了$s[1]$结果炸掉了2333 ...

  8. Luogu P3946 ことりのおやつ(小鸟的点心) 【最短路】By cellur925

    题目传送门 日本的冬天经常下雪.不幸的是,今天也是这样,每秒钟雪的厚度会增加q毫米. 秋叶原共有n个地点,编号从1到n.每个地点在开始的时候的积雪高度为hi. 有m条双向道路连接这些地点,它们的长度分 ...

  9. mycat启动报错UnknownHostException(Temporary failure in name resolution)解决方法

    重启命令 ./mycat restart 查看日志 cd logs tail -f wrapper.log 报错信息 INFO | jvm 2 | 2018/05/09 11:28:28 | Erro ...

  10. iOS MD5 (Swift3)

    import Foundation extension Int { func hexedString() -> String { return NSString(format:"%02 ...