题目链接:

https://www.luogu.org/problemnew/show/P1198

题目描述

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

1、 查询操作。

语法:Q L

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

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

2、 插入操作。

语法:A n

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

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

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

输入输出格式

输入格式:

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

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

输出格式:

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

输入输出样例

输入样例#1: 复制

5 100
A 96
Q 1
A 97
Q 1
Q 2
输出样例#1: 复制

96
93
96

单调栈解法。因为题目求的是末尾L个数的最大值,利用两个栈分别存储最大值和最大值的位置。然后二分查找。注意二分查找时上界是总得个数减去区间长度,而不是栈的空间减去区间长度,因为不符合栈的数值已经出栈了。

单调栈解法参考自:https://www.luogu.org/blog/user38348/solution-p1198

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
long long Stack[2][200010];
long long cnt=0,top=0;
void add(long long val){
cnt++;
while(Stack[0][top]<val&&(top>0)) top--;
Stack[0][++top]=val;
Stack[1][top]=cnt;
}
long long quiry(long long L){
int l=1,r=top;
int ind=cnt-L+1;
// int ind=top-L+1;
while(l<r){
int mid=(l+r)>>1;
if(Stack[1][mid]<ind) l=mid+1;
else r=mid;
}
return Stack[0][l];
}
int main(int argc, char** argv) {
int M;long long D;
scanf("%d %lld",&M,&D);
long long t=0;
while(M--){
char c;
long long d;
cin>>c>>d;
if(c=='A'){
add((t+d)%D);
}
else if(c=='Q'){
t=quiry(d);
printf("%lld\n",t);
}
}
return 0;
}

线段树解法,维护区间的最大值。

#include <iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=200010*4;
ll Max[maxn]; void add(int p,int l,int r,int x,ll c){
if(l==r){
Max[p]=c;return;
}
int mid=(l+r)>>1;
if(x<=mid) add(p<<1,l,mid,x,c);
else add(p<<1|1,mid+1,r,x,c);
Max[p]=max(Max[p<<1],Max[p<<1|1]);
}
int quiry(int p,int l,int r,int a,int b){
if(a>r||b<l) return -1e8;
if(a<=l&&r<=b){
return Max[p];
}
int mid=(l+r)>>1;
return max(quiry(p<<1,l,mid,a,b),quiry(p<<1|1,mid+1,r,a,b));
}
int main(int argc, char** argv) {
int M,D;
scanf("%d %d",&M,&D);
fill(Max,Max+maxn,-1e8);
ll t=0;
int x=0;
while(M--){
char c;int d;
cin>>c>>d;
if(c=='A'){
x++;
ll num=(t+d)%D;
add(1,1,200010,x,num);
}else if(c=='Q'){
t=quiry(1,1,200010,x-d+1,x);
printf("%lld\n",t);
}
}
return 0;
}

洛谷P1198 [JSOI2008]最大数(线段树/单调栈)的更多相关文章

  1. 「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数

    「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数 题面描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数, ...

  2. 洛谷 P1198 [JSOI2008]最大数

    洛谷 P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. ...

  3. 洛谷P1198 [JSOI2008]最大数(单点修改,区间查询)

    洛谷P1198 [JSOI2008]最大数 简单的线段树单点问题. 问题:读入A和Q时,按照读入一个字符会MLE,换成读入字符串就可以了. #include<bits/stdc++.h> ...

  4. 【题解】洛谷P1198 [JSOI2008] 最大数(线段树)

    洛谷P1198:https://www.luogu.org/problemnew/show/P1198 思路 一道水水的线段树 20分钟A掉 这道题只涉及到单点修改和区间查询 所以这道题甚至不用Laz ...

  5. 洛谷P1198 [JSOI2008]最大数

    P1198 [JSOI2008]最大数 267通过 1.2K提交 题目提供者该用户不存在 标签线段树各省省选 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 WA80的戳这QwQ BZOJ都 ...

  6. 洛谷 P1198 [JSOI2008]最大数——单调栈/线段树

    先上一波题目 https://www.luogu.org/problem/P1198 题目要求维护后缀最大值 以及在数列的最后面添加一个数 这道题呢我们有两种做法 1.单调栈 因为只需要维护后缀最大值 ...

  7. 洛谷P1198 [JSOI2008]最大数(线段树)

    题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:LLL不超过当前数列的长度.(L> ...

  8. 洛谷P1198 [JSOI2008]最大数(BZOJ.1012 )

    To 洛谷.1198 最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当 ...

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

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

随机推荐

  1. 二叉排序树(BST)

    二叉排序树(BST) 二叉排序树,又称二叉查找树(BST) 左子树结点值<根节点值<右子树结点值 如果用中序遍历来遍历一棵二叉排序树的话,可以得到一个递增的有序数列 左根右 二叉排序树的查 ...

  2. JavaSE11-多态&抽象类&接口

    1.多态 1.1 多态的概述 什么是多态 同一个对象,在不同时刻表现出来的不同形态 多态的前提 要有继承或实现关系 要有方法的重写 要有父类引用指向子类对象 1.2 多态中的成员访问特点 成员访问特点 ...

  3. Windows 64位下安装php的redis扩展(php7.2+redis3.0)

    前置条件:为php7.2搭建redis扩展的前提是在本机上已经成功搭建好php的运行环境,我的电脑的运行环境时 apache2.4+mysql5.5+php7.2. 操作系统为64位,编译环境为Mic ...

  4. Web常用编码以及攻击绕过笔记

    一.URL编码形式:"%"加上ASCII码(先将字符转换为两位ASCII码,再转为16进制),其中加号"+"在URL编码中和"%20"表示一 ...

  5. 主数据管理(MDM)的6大层级简述,你不可不知的数据治理参考!

    前面我写了一篇关于对元数据和元数据管理的认知和理解的文章,有兴趣的朋友可以去看看.接下来我们讲一讲主数据管理(MDM). 主数据管理(MDM) 主数据是系统间共享数据,它是系统间信息交换的基准.主数据 ...

  6. CentOS8更换国内YUM源

    rm -rf /etc/yum.repos.d/* wget -O /etc/yum.repos.d/CentOS-cnnic.repo https://feieryun.oss-cn-zhangji ...

  7. Liunx运维(六)-文件备份与压缩命令

    文档目录: 一.tar:打包备份 二.gzip:压缩或解压文件 三.zip:打包和压缩文件 四.unzip:解压zip文件 五.scp:远程文件复制 六.rsync:文件同步工具 ---------- ...

  8. replaceAll

    /**  * 根据正则是,替换对应内容  * @return  */ public static String replaceByRegex(String regex,String src,Strin ...

  9. JAVA读取EXCEL_自动生成实体类

    代码实现PropertyAnno.java import java.lang.annotation.ElementType; import java.lang.annotation.Retention ...

  10. 22. Generate Parentheses生成指定个括号

    生成指定个数的括号,这些括号可以相互包括,但是一对括号的格式不能乱(就是配对的一个括号的左括号要在左边,右括号要在右边) 思维就是从头递归的添加,弄清楚什么时候要添加左括号,什么时候添加右括号 有点像 ...