https://www.luogu.org/problem/P1198

update!!!

经过老师的讲解,惊人的发现这题有用更简单数据结构维护的解法,而越简单的数据结构(如果能够用的话),越好(实现和思维上都会好一些)。

首先,这题是强制在线的,而这类题,如果你RE了,那么说明一般是你前面加密的东西求错了(比如这题的t)。

现在进入正题:

因为题目中需要输出的是后L个数的max,我们考虑两个数x,y, 满足x < y,如果高度还a[x] < a[y], 那么a[x]就一定不会成为答案(无论x,y在没在L内)。

所以我们维护一个保存着可能为答案的点的编号的单调队列,即维护a[i]递减的,关于 i 的单调队列(因为答案要的是后L个的,所以你要维护的是编号,并且还需要一个二分来找答案)。

题意

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

1、 查询操作。

语法:Q L

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

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

2、 插入操作。

语法:A n

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

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

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

操作数 <= \(2 * 10^5\)

分析

本来是找线段树的题目做的,但这题明显大材小用了....为什么呢?

我们注意到,它插入的时候只会把这个数插到数列的末尾,而且查询的时候也只是会查询后L个数。

于是,我们可以用一个反向的st表来维护(这个是在看了题解一之后想到的...惭愧...)(反向st即表示st[i] [j]为[i-(1<<j)+1, i]的最大值)

先想怎么插入,即插入之后需要改变哪些东西。好好想想“查询后L个数中的最大值”, 得出这个st表的右边界一定是n(数的个数), 所以,我们想到了反向st表,因为这样,我们唯一需要改变的量就是st[n] [...], n前面的数的st都不用修改,因为我们是反向的啊。

再想想怎么查询, 只要你把你脑子 思想倒过来,反向实现RMQ即可。

思考后参考

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
#define ll long long
#define MAX 200000+9 int n,m;
ll f[MAX][21], a[MAX], D;//f[i][j]表示[i-(1<<j)+1, i]的最大值 void putback(int x) {
f[x][0] = a[x];// 别忘了放到最后
for(int i = 1; x-(1<<i)+1 >= 1; i++) {
f[x][i] = max(f[x][i-1], f[x-(1<<(i-1))][i-1]);
}
} ll RMQ(int l, int r) {
int k = 0;
while((1<<(k+1) <= r-l+1)) k++;
return max(f[r][k], f[l+(1<<k)-1][k]);//始终是反向思考
} int main() {
scanf("%d%lld",&m,&D);
char cmd;
ll x, t = 0;
for(int i = 1; i <= m; i++) {
cin>>cmd;
if(cmd == 'A') {
scanf("%lld",&x);
a[++n] = (x+t)%D;
putback(n);
} else {
int L;
scanf("%d", &L);
if(L == 1) {
printf("%lld\n", a[n]);
t = a[n];
continue;
}
ll ans;
ans = RMQ(n-L+1, n);
printf("%lld\n", ans);
t = ans;
}
}
return 0;
}

luoguP1198 [JSOI2008]最大数的更多相关文章

  1. [luoguP1198][JSOI2008] 最大数(线段树 || 单调栈)

    题目传送门 1.线段树 线段树可以搞. 不过慢的要死1300+ms #include <cstdio> #include <iostream> using namespace ...

  2. BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]

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

  3. BZOJ-1012[JSOI2008]最大数maxnumber 线段树区间最值

    这道题相对简单下面是题目: 1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MB Submit: 6542 Solve ...

  4. 洛谷P1198 [JSOI2008]最大数

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

  5. 【bzoj1012】[JSOI2008]最大数maxnumber

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

  6. Cogs 1844. [JSOI2008]最大数maxnumber

    [JSOI2008]最大数maxnumber ★★ 输入文件:bzoj_1012.in 输出文件:bzoj_1012.out 简单对比 时间限制:3 s 内存限制:162 MB [题目描述] 现在请求 ...

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

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

  8. [JSOI2008]最大数maxnumber

    [JSOI2008]最大数maxnumber 标签: 线段树 单独队列 题目链接 题解 线段树裸题. 如果一直RE可能是你用的cin/cout. Code #include<cstdio> ...

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

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

随机推荐

  1. 执行DOS命令并返回结果

    public static String excuteCommand(String command){ Runtime runtime = Runtime.getRuntime(); try { Pr ...

  2. oracle 分组拼接

    方法一:listagg, 参考链接,从oracle11g后出现的新函数 如果拼接的字符串长度超过4000字节,会报ora-01489错误,ora-01489 字符串连接的结果过长 解决方案. SELE ...

  3. (day55)七、查询优化、MTV和MCV、choices、AJAX、序列化

    目录 一.ORM查询优化 (一)only与defer (1)only (2)defer (二)select_related与prefatch_related (1)select_related (2) ...

  4. luoguP2824 [HEOI2016/TJOI2016]排序(二分答案做法)

    题意 这题的思路实在巧妙. 首先我们肯定无法对区间进行sort,那么考虑如何使得sort简化. 问:如果给的序列是一个0-1序列,让你区间排序,那么怎么做? 答:建一颗线段树维护sum,求出当前区间中 ...

  5. 工具资源系列之给 windows 虚拟机装个 ubuntu

    前面我们已经介绍了如何在 Windows 宿主机安装 VMware 虚拟机,这节我们将利用安装好的 VMware 软件安装 Ubuntu 系统. 前情回顾 虚拟机为我们在 Windows 宿主机体验别 ...

  6. jdk 自带命令行工具

    jps工具 虚拟机进程状况工具 工具主要选项 jstat: 虚拟机统计信息监视工具 jinfo: Java配置信息工具 jinfo( Configuration Info for Java) 的作用是 ...

  7. angular6 ngx-echarts 图表数据更新

    最近在用angular写一个echarts图表,初始化赋值数据可以展示,但是重新获取数据以后,图表不会刷新. 后来发现了问题点所在, <div echarts class="demo- ...

  8. hydra 常用命令解析

    参数说明: Hydra v9.0 (c) 2019 by van Hauser/THC - Please do not use in military or secret service organi ...

  9. backbone 路由传参(可选)

    因为维护公司的老项目而接触到backbone.以前是只闻其名,未见其码. 因为其他项目需要跳转到本项目的某个页面,但是需要UI改变. 考虑的方法是给路由添加一个可选参数.代码如下: 正常路由: rou ...

  10. HTML连载18-id选择器与class区别&class选择器使用思路&后代选择器

    一.id选择器和classable选择器的区别 选择器 CSS中的开头 HTML标签可以绑定几个 是否可重复 用途 id选择器 # 仅能一个 不可以重复(一个标签里仅有一个) 一般情况下是给JS用的, ...