这道题做法多多… 这道题的出题意图应该是单调栈+二分,即维护一个单调递减的栈,然后二分一下,找到后\(L\)个元素之内最小的即可(注意这个栈里存的是下标,原序列的所有元素都还是要保存的。一开始理解错了,用了pair,然后自己发现了问题之严重…)。

当然还可以大暴力(其实是个伪单调队列?),在黄学长博客上看到的,给吓傻了。

然后本题还可以套数据结构。最暴力的方法是直接上线段树。然后树状数组也可以做,详见iwtwiioi的博客:http://www.cnblogs.com/iwtwiioi/p/3869868.html。

以下把前三种方法的份代码都贴出来,提交记录见下面的网页,我只想说我的内心是崩溃的(忽略最后的两次CE… 黑历史…)
http://www.lydsy.com/JudgeOnline/status.php?problem_id=1012&user_id=yearwhk&language=-1&jresult=-1

代码一(暴力):

// BZOJ 1012_1#include <cstdio>
#include <cstring>
using namespace std;const int N=200000+5;#define rep(i,a,b) for (int i=a; i<=b; i++)#define dep(i,a,b) for (int i=a; i>=b; i--)#define read(x) scanf("%d", &x)#define fill(a,x) memset(a, x, sizeof(a))int m, mod, x, max[N], num[N];char mode;int main()
{read(m); read(mod);int pre=0, n=0;while (m--) {scanf("\n%c%d", &mode, &x);if (mode=='A') {x=(x+pre)%mod;num[++n]=x;dep(i,n,1) if (max[i]<x) max[i]=x; else break;// max[i]是[i..n]范围内的最大值}else printf("%d\n", pre=max[n-x+1]);}return 0;
}

(这份代码很容易被卡掉的啊… 只能说数据太弱…)

代码二(单调栈):

// BZOJ 1012_2#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;const int N=200000+5;#define rep(i,a,b) for (int i=a; i<=b; i++)#define dep(i,a,b) for (int i=a; i>=b; i--)#define read(x) scanf("%d", &x)#define fill(a,x) memset(a, x, sizeof(a))#define mp(x,y) make_pair(x,y);int m, mod, x, n, s[N], num[N];char mode;int main()
{read(m); read(mod);int pre=0, n=0, top=0;while(m--) {scanf("\n%c%d", &mode, &x);if (mode=='A') {x=(x+pre)%mod;num[++n]=x;while (top && num[s[top]]<=x) top--;s[++top]=n;}else {int y=lower_bound(s+1, s+top+1, n-x+1)-s;pre=num[s[y]];printf("%d\n", pre);}}return 0;
}

代码三(线段树):

// BZOJ 1012_3#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;const int N=200000+5, INF=0x3f3f3f3f;int m, mod;char mode;struct Node {int l, r, w;} maxv[N*4];#define read(x) scanf("%d", &x)#define rep(i,a,b) for (int i=a; i<=b; i++)void build(int o, int L, int R) {maxv[o].l=L, maxv[o].r=R, maxv[o].w=-INF;if (L==R) return;int M=(L+R)>>1;build(o<<1, L, M);build(o<<1|1, M+1, R);}int query(int o, int x, int y) {int L=maxv[o].l, R=maxv[o].r;if (L==x && R==y) return maxv[o].w;int ls=o<<1, rs=o<<1|1, M=(L+R)>>1;if (y<=M) return query(ls, x, y);else if (x>M) return query(rs, x, y);else return max(query(ls, x, M), query(rs, M+1, y));}void update(int o, int x, int y) {int L=maxv[o].l, R=maxv[o].r;if (L==R) { maxv[o].w=y; return; }int ls=o<<1, rs=o<<1|1, M=(L+R)>>1;if (x<=M) update(ls, x, y); else update(rs, x, y);maxv[o].w=max(maxv[ls].w, maxv[rs].w);}int main()
{read(m); read(mod);build(1,1,m);int pre=0, n=0, x;while (m--) {scanf("\n%c%d", &mode, &x);if (mode=='A') {x=(x+pre)%mod;update(1, ++n, x);}else printf("%d\n", pre=query(1, n-x+1, n));}return 0;
}

(线段树竟然比暴力还慢…)

方法四(树状数组):艹完暴力之后,用树状数组优化就会感到十分自然了…

转载于:https://www.cnblogs.com/yearwhk/p/5128578.html

BZOJ 1012 - 树状数组+维护最大值 / 单调栈+二分 / 暴力(伪单调队列) / 线段树...相关推荐

  1. P4062 [Code+#1]Yazid 的新生舞会(区间绝对众数+分治/树状数组维护高维前缀和)

    P4062 [Code+#1]Yazid 的新生舞会 杭电多校懂得都懂 Code1 分治 比较喜欢分治的做法,非常好写.skylee大佬题解 首先对于任何一个区间来说,由于两个端点不确定性非常难以一次 ...

  2. (每日一题)P3312 [SDOI2014]数表(经典莫比乌斯反演 + 树状数组维护离线询问)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每日一题(莫反 / 多项式 / 母函数 / 群论) 2021.4.11 莫反 P3312 [SDOI2 ...

  3. 【POJ - 3321】 Apple Tree(dfs序 + 线段树维护 或 dfs序 + 树状数组维护)

    题干: There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the t ...

  4. 树状数组维护区间和的模型及其拓广的简单总结

    by wyl8899 树状数组的基本知识已经被讲到烂了,我就不多说了,下面直接给出基本操作的代码. 假定原数组为a[1..n],树状数组b[1..n],考虑灵活性的需要,代码使用int *a传数组. ...

  5. BZOJ1103 大都市 DFS序 树状数组维护差分数组

    BZOJ1103 大都市 问题描述 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了. 不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次 ...

  6. 牛客练习赛52.Galahad(树状数组维护区间不相同数的和)

    链接:https://ac.nowcoder.com/acm/contest/1084/B 来源:牛客网 Galahad 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K ...

  7. 二维树状数组 ----2021广东省赛 ----- K - Kera‘s line segment[区间转二维平面+树状数组维护前缀最小最大值]

    题目链接 题目大意: 就是一个一维的数轴上面有一堆线段用一个三元组(l,r,val)(l,r,val)(l,r,val)表示. 现在我们有两个操作: 就是往数轴上面添加线段 询问[L,R][L,R][ ...

  8. P4062 [Code+#1]Yazid 的新生舞会 树状数组维护三阶差分

    传送门 文章目录 题意: 思路: 题意: 给你一个序列aaa,让你求有多少个子区间满足存在一个数是这个区间的绝对众数,绝对众数指该数在区间内出现的次数严格大于r−l+12\frac{r-l+1}{2} ...

  9. 牛客练习赛52 B:Galahad(树状数组维护区间不同元素和(个数))

    [题目] 查询区间和,如果区间元素重复出现则计数一次. [题解] 按区间的右端点建立树状数组,维护区间[1,R]的每个元素的最右位置.按查询区间的右端点排序,依次处理,每次更新当前值的最右位置即可. ...

  10. C. Tyler and Strings(组合数学,树状数组维护前缀和)(Codeforces Round #775 (Div. 1, based on Moscow Open Olympiad i)

    对我来说比较困难的一题了,尝试着自己写了一下,调不出来遂放弃. Codeforces Round #775 (Div. 1, based on Moscow Open Olympiad in Info ...

最新文章

  1. 全球计算机视觉顶会CVPR 2020论文出炉:腾讯优图17篇论文入选
  2. Sitecake – 可视化编辑,所见即所得的 CMS
  3. 25、HTML 文本格式化
  4. epub java虚拟机精讲_高级 Java 必须掌握:JVM 分析工具和查看命令,超详细!
  5. linux安装autossh详细教程,在Linux下安装autossh的教程
  6. OpenCV学习笔记(十三):霍夫变换:HoughLines(),HoughLinesP(),HoughCircles( )
  7. python searchsorted_Python 二分查找与 bisect 模块
  8. (原)数据结构之树状数组详解
  9. 此博客记录我的日常学习过程
  10. 拼图复原_玩过上百款拼图后,我总结出这份超详细的拼图年龄对照表!(收藏贴)...
  11. 逃跑h5小游戏源码熊出没手机游戏
  12. 自动化车辆的开发、测试和验证场景
  13. ROS 基础知识(一)
  14. 使用vue-giant-tree根据id定位位置
  15. Github Actions实现自定义编译OpenWRT固件和第三方插件
  16. java文章采集爬虫代码示例
  17. elasticsearch7.5 索引状态yellow问题解决
  18. 使用Math.max和Math.min求数组的最大值和最小值
  19. Leetcode 45:跳跃游戏 II(最详细的解法!!!)
  20. WPF快速入门2—布局WrapPanel,DockPanel,StackPanel,Canvas

热门文章

  1. Linux-nginx安装
  2. 【Code Review】赛后专访
  3. 【图文】远程桌面链接:这可能是由于credssp加密oracle修正
  4. 【Maven】1.使用myecplise配置自己的Maven配置,不使用默认的maven
  5. Clojure 1.7引入Transducers,提高跨平台支持度
  6. 迄今为止最全:Oracle WebLogic Server产品版本介绍
  7. 开始学习:Ruby On Rails
  8. PhotoShop插件的开发
  9. 十二、I/O复用介绍
  10. 数据--第39课 - 二叉树课后练习