P1198 [JSOI2008]最大数(线段树基础)
P1198 [JSOI2008]最大数
题目描述
现在请求你维护一个数列,要求提供以下两种操作:
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行,每行一个字符串,描述一个具体的操作。语法如上文所述。
输出格式
对于每一个查询操作,你应该按照顺序依次输出结果,每个结果占一行。
输入输出样例
5 100
A 96
Q 1
A 97
Q 1
Q 2
96
93
96
说明/提示
[JSOI2008]
本题数据已加强
题解:为线段树基础……适合刚学线段树的人写一下开拓一下思路。根据题目我们可以将线段的sum改为该线段中的最大值,这样会简单快速许多,具体见下代码;
#define _CRT_SECURE_NO_DepRECATE
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <iostream>
#include <cmath>
#include <iomanip>
#include <string>
#include <algorithm>
#include <bitset>
#include <cstdlib>
#include <cctype>
#include <iterator>
#include <vector>
#include <cstring>
#include <cassert>
#include <map>
#include <queue>
#include <set>
#include <stack>
#define ll long long
#define INF 0x3f3f3f3f
#define ld long double
const ld pi = acos(-.0L), eps = 1e-;
int qx[] = { ,,,- }, qy[] = { ,-,, }, qxx[] = { ,- }, qyy[] = { ,- };
using namespace std;
struct node
{
ll l = , r = , sum = , plz = , mlz = ;
}tree[];
ll p = INF, maxx;
inline void build(int i, int l, int r, int insert,int num)//树的编号 最左端 最右端 插入的值 插入的下标
{
tree[i].l = l;
tree[i].r = r;
if (l == r)//找到该点即替换为insert
{
tree[i].sum = insert;
}
else
{
if ((l + r) / >= num)
{
build(i << , l, (l + r) / , insert, num);
}
else
{
build(i << | , (l + r) / + , r, insert, num);
}
tree[i].sum = max(tree[i << ].sum, tree[i << | ].sum);//每个线段的sum为该线段的最大值
}
}
inline ll search_max(int i, int l, int r)
{
if (tree[i].l >= l && tree[i].r <= r)//因sum即代表该线段的最大值,所以找到完全包含的线段就可以直接返回sum
{
return tree[i].sum;
}
if (tree[i].l > r || tree[i].r < l)
{
return ;
}
ll ans = -INF;
if (l <= tree[i << ].r)
{
ans = max(ans, search_max(i << , l, r));
}
if (r >= tree[i << | ].l)
{
ans = max(ans, search_max(i << | , l, r));
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
ll m, d, t = , sum = , b,input;
char x;
cin >> m >> d;
for (int i = ; i < m; i++)
{
cin >> x;
if (x == 'A')
{
cin >> input;
input = (input + t) % d;
build(, , m, input, sum);//因为最多只能插入m个,所以可以直接以m为r
sum++;
}
else
{
cin >> b;
t = search_max(, sum - b, sum - );
cout << t << endl;
}
}
return ;
}
P1198 [JSOI2008]最大数(线段树基础)的更多相关文章
- [JSOI2008]最大数 (线段树)
题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当前数列的长度.(L>=0 ...
- [JSOI2008]最大数 线段树解法
题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当前数列的长度. 2. 插入操作 ...
- BZOJ1012 [JSOI2008]最大数 线段树
题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:LLL不超过当前数列的长度.(L> ...
- P1198 [JSOI2008]最大数【树状数组】
题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制: L 不超过当前数列的长度. (L &g ...
- 「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数
「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数 题面描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数, ...
- P1198 [JSOI2008]最大数(线段树)
P1198 [JSOI2008]最大数(线段树) 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值 ...
- 洛谷P1198 [JSOI2008]最大数
P1198 [JSOI2008]最大数 267通过 1.2K提交 题目提供者该用户不存在 标签线段树各省省选 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 WA80的戳这QwQ BZOJ都 ...
- 洛谷 P1198 [JSOI2008]最大数
洛谷 P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. ...
- 洛谷P1198 [JSOI2008]最大数(单点修改,区间查询)
洛谷P1198 [JSOI2008]最大数 简单的线段树单点问题. 问题:读入A和Q时,按照读入一个字符会MLE,换成读入字符串就可以了. #include<bits/stdc++.h> ...
随机推荐
- CVPR 2020 三篇有趣的论文解读
作者 | 文永亮 学校 | 哈尔滨工业大学(深圳) 研究方向 | 视频预测.时空序列预测 目录 AdderNet - 其实不需要这么多乘法 Deep Snake for Real-Time Insta ...
- Flutter Form表单控件超全总结
注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 Form.FormField.TextFormField是 ...
- 【03】openlayers 地图事件
绑定事件:map.on(type, listener) 取消绑定:map.un(type, listener) type:事件类型 listener:执行得函数体 事件类型: //事件类型 let t ...
- MATLAB神经网络(2)之R练习
1. AMORE 1.1 newff newff(n.neurons, learning.rate.global, momentum.global, error.criterium, Stao, hi ...
- Learn Regex The Easy Way
GitHub上的正则表达式在线学习Learn Regex The Easy Way,可以帮助初学者快速入门 该项目已汉化,可在线练习 地址:https://github.com/ziishaned/l ...
- 探究Spring Boot中的接收参数问题与客户端发送请求传递数据
结合此篇参考Spring框架学习笔记(9)--API接口设计相关知识及具体编码实现 在使用Spring Boot进行接收参数的时候,发现了许多问题,之前一直都很忙,最近才稍微有空研究一下此问题. 网上 ...
- inspect的使用安卓动态分析工具
一.安装步骤 1.安装xposed 2.安装inspect 二.inspect 一个基于Xposed 开发的应用动态分析工具 github已开源 内置web页面 体验度很不错 ‘ 核心功能 监控Sha ...
- 微信公众号 H5页面 支付注意细节
1. 当秘钥(AppSecretApplets) 有问题时注意是不是已经被重置过了,此时要注意获取最新的秘钥: 2. 调试时后端的东西要放在线上https 请求 不然在手机上测试时 会被拦截: ...
- java输入输出流操作同一资源实现覆盖引发冲突的解析
一.问题发生的场景 题目:把s.txt中大写转成小写,小写转成大写,空格转成下划线,在输入到文件中覆盖之前的 前面的没有问题,问题出现在后面的覆盖文件上,输入流.输出流要操作同一个文件的问题 二.小白 ...
- 什么是Hibernate
Hibernate是一个基于JDBC的主流持久性框架,是一个优秀的ORM(object relation mapping)(对象关系映射)实现 ORM就是通过java对象映射到数据库表中,通过操作ja ...