原题:

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

1、 查询操作。语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值。限制:L不超过当前数列的长度。

2、 插入操作。语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾。限制:n是非负整数并且在长整范围内。注意:初始时数列是空的,没有一个数。

Input

  第一行两个整数,M和D,其中M表示操作的个数(M <= 200,000),D如上文中所述,满足D在longint内。接下来M行,查询操作或者插入操作。

Output

  对于每一个询问操作,输出一行。该行只有一个数,即序列中最后L个数的最大数。

Sample Input

5 100
A 96
Q 1
A 97
Q 1
Q 2

Sample Output

96
93
96

题解:

这题一看就是建一个线段树来维护区间的题,但是对于一个萌新来说线段树我都没咋搞明白……据说用单调队列也可以做,但是很麻烦,而且我也没有啥思路……在某位大佬的提示下,我去现学了树状数组,可算是把这题给搞过了。关于树状数组,欢迎前往OI Wiki查看

首先,就是树状数组几件套——lowbit操作,找爹,找前段操作。顺带把需要的变量也准备好了。之前吃过很多次变量定义在函数内部导致堆栈爆炸的亏,所以我视题目要求把一些变量扔到了函数外边,做成了全局变量。而且,全局变量默认值都是0,也省得初始化了。(咳咳,其实初始化是个好习惯,之前写多组的时候就吃过初始化的亏,还好这个题是单组emmm)

const int MAX = 2e5 + 5;
ll a[MAX];
ll tree[MAX]; int sz;
int m;
ll d; inline int lowbit(int &x) {
return x & (-x);
}
inline int fa(int &x) {
return x + lowbit(x);
}
inline int pre(int &x) {
return x - lowbit(x);
}

然后就是更新 和查询函数怎么写的问题了。题目的要求是把数据插入到数列的末尾,查询的时候返回末L位的最大值,根据这些条件,我发现(其实不是我发现的),每次操作都和数列的末尾有关。正常的更新是从小到大,查询是从大到小,但是这是针对从数列开头来说的,因此在这里更新和查询的遍历方式颠倒一下,更新从大到小,查询从小到大。

void update(ll num) {
a[++sz] = num;//读入数据,同时更新此时的容量
for (int i = sz; i > 0; i = pre(i)) {
tree[i] = max(tree[i], num);
}
}
ll query(int k) {
ll maxx = 0;
for (int i = sz - k + 1; i <= sz; i = fa(i)) {//末尾k个数,寻找的边界索引需要+1
maxx = max(maxx, tree[i]);
}
return maxx;
}

然后就是普通的AC代码啦。这里其实还有一个小技巧:scanf里面的格式化字符串如果需要读入一个字符(%c)的话,可以在其前面加一个空格,写成" %c %lld"的形式,意思就是说读入的时候忽略%c前面的空白字符,包括空格、回车、制表符以及一些其他的不可见符号。要不然,在输入第一组查询命令后,按下回车,回车符会被下一轮中的%c给吃掉emmm……

#include <bits/stdc++.h>
#define grp int T;cin>>T;while(T--)
#define elif else if
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rrep(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
typedef long long ll; const int MAX = 2e5 + 5;
ll a[MAX];
ll tree[MAX]; int sz;
int m;
ll d; inline int lowbit(int &x) {
return x & (-x);
}
inline int fa(int &x) {
return x + lowbit(x);
}
inline int pre(int &x) {
return x - lowbit(x);
} void update(ll num) {
a[++sz] = num;
for (int i = sz; i > 0; i = pre(i)) {
tree[i] = max(tree[i], num);
}
}
ll query(int k) {
ll maxx = 0;
for (int i = sz - k + 1; i <= sz; i = fa(i)) {
maxx = max(maxx, tree[i]);
}
return maxx;
} int main() { scanf("%d %lld", &m, &d);
char q;
ll n;
ll t = 0;
rep(i, 1, m) {
scanf(" %c %lld", &q, &n);
if (q == 'Q') {
t = query(n);
printf("%lld\n", t);
}
elif(q == 'A') {
update((n + t) % d);
}
} return 0;
}

最大数maxnumber - 题解【树状数组】的更多相关文章

  1. 【BZOJ】1012: [JSOI2008]最大数maxnumber(树状数组+rmq)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1012 树状数组原来我只懂得sum和add的操作,今天才知道可以有求区间最值的操作,我学习了一下写了个 ...

  2. luoguP2184 贪婪大陆 题解(树状数组)

    P2184 贪婪大陆  题目 其实很容易理解就是询问一段区间内有多少段不同的区间 然后再仔细思索一下会发现: 1.只要一个区间的开头在一个节点i的左边,那么这个区间包含在区间1~i中. 2.只要一个区 ...

  3. [SCOI2014]方伯伯的玉米田 题解(树状数组优化dp)

    Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...

  4. 小结:线段树 & 主席树 & 树状数组

    概要: 就是用来维护区间信息,然后各种秀智商游戏. 技巧及注意: 一定要注意标记的下放的顺序及影响!考虑是否有叠加或相互影响的可能! 和平衡树相同,在操作每一个节点时,必须保证祖先的tag已经完全下放 ...

  5. Bzoj 1901: Zju2112 Dynamic Rankings 主席树,可持久,树状数组,离散化

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6321  Solved: 2628[Su ...

  6. 【树状数组】Bzoj1878[SDOI2009] HH的项链

    Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的项链变 ...

  7. COGS1752. [BOI2007]摩基亚Mokia(CDQ,树状数组)

    题目描述 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能够回 ...

  8. 【bzoj5157】[Tjoi2014]上升子序列 树状数组

    题目描述 求一个数列本质不同的至少含有两个元素的上升子序列数目模10^9+7的结果. 题解 树状数组 傻逼题,离散化后直接使用树状数组统计即可.由于要求本质不同,因此一个数要减去它前一次出现时的贡献( ...

  9. 【bzoj2743】[HEOI2012]采花 树状数组

    题目描述 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公 ...

  10. 洛谷P3759 [TJOI2017]不勤劳的图书管理员 【树状数组套主席树】

    题目链接 洛谷P3759 题解 树状数组套主席树板题 #include<algorithm> #include<iostream> #include<cstring> ...

随机推荐

  1. 74cms v4.2.1-v4.2.129-后台getshell漏洞复现

    0x00 影响范围 v4.2.1-v4.2.129 0x01 环境搭建 1. 先去官网下载 骑士人才系统基础版(安装包) 2.将下载好的包进行安装 0x02 复现过程 当前版本v4.2.111 点加工 ...

  2. Linux 安装mysql 看这一篇就够了

    mysql 安装教程 下载地址:https://downloads.mysql.com 查看系统中默认的mysql 依赖 rpm -qa | grep mysql rpm -qa | grep mar ...

  3. Java基础 - 异常详解

    异常的层次结构 Throwable Throwable 是 Java 语言中所有错误与异常的超类. Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示 ...

  4. Lua协程的一个例子

    很久没记录笔记了,还是养成不了记录的习惯 下面是来自 programming in lua的一个协程的例(生产者与用户的例子) 帖代码,慢慢理解 -- Programming in Lua Corou ...

  5. python 迭代器和生成器基础知识

    1.迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法--字符串.列表.元组.字典.集合都是可迭代的--可以被for循环的都是可迭代的 2. 迭代器有的好处是可以节省内存 3.生 ...

  6. (转载) MOS管区分NP沟道

    三极管是流控型器件,MOS管是压控型器件,两者存在相似之处.三极管机可能经常用,但MOS管你用的可能较少.对于MOS管先抛出几个问题: 如何区分P-MOS和N-MOS:   如何区分MOS的G.D.S ...

  7. ctfhub web 前置技能(请求方式、302跳转、Cookie)

    第一题:请求方式 打开环境分析题目发现当前请求方式为GET 查看源码发现需要将请求方式改为CTFHUB就可以 使用bp抓包 发送到repeater模块修改请求方式 即可得到flag 第二题:302跳转 ...

  8. CSS 文本控制

    one more time one more chance. 一歩重头学前端, css入门. 学习一些 CSS 文本控制的属性,防止做傻事.请大家对照下面列表检验下: 会的.不会的.似懂非懂的.笔者是 ...

  9. React 和 ES6 工作流之 Webpack的使用(第六部分)

    这是React和ECMAScript2015系列文章的最后一篇,我们将继续探索React 和 Webpack的使用. 下面是所有系列文章章节的链接: React . ES6 - 介绍(第一部分) Re ...

  10. H5打造属于自己的视频播放器(JS篇2)

    回顾 算了不回顾了 直接搞起,打开JS1中写的bvd.js 播放视频 播放按钮隐藏 视频开始播放 当点击播放按钮的时候,播放按钮将会隐藏,播放视频,这个不难,在JS1中我们就已经实现.但我们改变一下思 ...