★★   输入文件: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. codeforces 690C3 C3. Brain Network (hard)(lca)

    题目链接: C3. Brain Network (hard) time limit per test 2 seconds memory limit per test 256 megabytes inp ...

  2. [Selenium] Selenium common Actions Examples

    1.sendKeys() 在文本框中输入字符串 WebElement searchBox = driver.findElement(By.name("q")); searchBox ...

  3. AFNetworking 2.0教程

    在iOS 7中,Apple更新了iOS中的网络基础架构,新推出的网络基础架构是NSURLSession(原来的网络基础架构NSURLConnection). iOS开发中往往会涉及网络数据处理,像其他 ...

  4. bzoj2144

    二分+lca 我们把向中间缩看成向上爬,向两边走看成向下爬,那么就相当于找出两个状态的lca,如果相邻的差是(a,b),a<b,那么向中间走就是(a,b-a)或(b-a,a),这个东西很像更相减 ...

  5. Android菜单代码

    前言: 学习android断断续续也有一年半左右,但一直在学习,很少回顾以往的知识.所以我打算用业余时间来写一些这样总结性的文章,希望温故知新. 以下只是我个人的一些感悟和见解(当然会查证资料验证), ...

  6. Java:String之间通过==比较的情况

    大家都知道在String之间的内容比较的时候,是通过equals函数比较的. 但是在在许多的面试题中,总是出现一堆的判断两个String对象通过==比较的结果,实际上是考的Java内存分配机制. Ja ...

  7. 用Xtrabackup实现MySQL全库备份与恢复

    xtrabackup包含两个主要的工具,即xtrabackup和innobackupex,二者区别如下: (1)xtrabackup只能备份innodb和xtradb两种引擎的表,而不能备份myisa ...

  8. Robotframework自动化系列:筛选结果数量统计

    Robotframework自动化系统:筛选结果数量统计 上一个节点已经可以随机选中某一个下拉框的值,我们在使用evaluate随机数的时候需要计算下拉选项总数,这时候我们是手工计算输入的:这时候如果 ...

  9. CIFAR10自定义网络实战

    目录 CIFAR10 MyDenseLayer CIFAR10 MyDenseLayer import os import tensorflow as tf from tensorflow.keras ...

  10. poj 1723 Soldiers【中位数】By cellur925

    题目传送门 题目大意:平面上有n个士兵,给出每个士兵的坐标,求出使这些士兵站好所需要的最少移动步数.站好要求:所有士兵y相等,x相邻.即达到 (x,y), (x+1, y), (x+2,y)……的状态 ...