题目描述

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

1、 查询操作。

语法:Q L

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

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

2、 插入操作。

语法:A n

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

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

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

输入格式

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

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

输出格式

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

输入输出样例

输入 #1

5 100
A 96
Q 1
A 97
Q 1
Q 2
输出 #1

96
93
96 线段树裸题。有这么几个需要注意的地方:
1.要错误理解当前序列最右侧与整个线段树最右侧叶子节点的关系!事先建树时是按照最大规模建的,所以在不断加入点的过程中序列最右端对应的叶子节点实际上是在线段树的最左与最右边叶子节点之内的。
2.INF一定要足够大,0x3f3f3f3f3f3f3f3f可以保证不爆。
3.对于Q,A若用scanf读取最好是%s,不然的话处理换行符会比较啰嗦。
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;
int M,D;
long long length=;
struct SegmentTree
{
int l;
int r;
long long val;
}t[];
void build(int k,int l,int r)
{
t[k].val=-INF;
t[k].l=l;
t[k].r=r;
if(l==r)
{
return;
}
int mid=(l+r)/;
build(*k,l,mid);
build(*k+,mid+,r);
}
long long query(int k,int l,int r,int x,int y)//k为当前节点编号,l为当前节点覆盖区间左端点,r为右端点,x是操作区间左端点,y为操作区间右端点
{
if(l>=x&&r<=y)return t[k].val;
int mid=(l+r)/;
long long ans=-INF; //赋值为负无穷
if(mid>=x)
{
ans=query(*k,l,mid,x,y);
}
if(y>mid)ans=max(ans,query(*k+,mid+,r,x,y));//线段树常见套路
return ans;
}
void add(int k,int l,int r,int y,int num)//num为操作数,其他类似
{
if(l==r)
{
t[k].val=num;
return;
}
int mid=(l+r)/;
if(y<=mid)add(*k,l,mid,y,num);//y代表了单点操作的点的位置。这个题y即为当前序列最右边的位置 。注意!!不要错误理解当前序列最右侧与整个线段树最右侧叶子节点的关系!事先建树时是按照最大规模建的,所以在不断加入点的过程中序列最右端对应的叶子节点实际上是在线段树的叶子节点之内的
else add(*k+,mid+,r,y,num);
t[k].val=max(t[*k].val,t[*k+].val);//不要忘记向上更新
}
int main()
{
cin>>M>>D;
long long last=;
build(,,);
while(M--)
{
char c[];
long long temp;
scanf("%s%lld",&c,&temp);
if(c[]=='A')
{
length++;
add(,,,length,(temp+last)%D);//
}
else if(c[]=='Q')
{
long long ans=query(,,,length-temp+,length);
last=ans;
printf("%lld\n",ans);
}
}
return ;
}


洛谷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]最大数(线段树/单调栈)

    题目链接: https://www.luogu.org/problemnew/show/P1198 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q 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. Java - Test - TestNG: testng.xml 元素 package

    1. 概述 简介 package 元素 packages package exclude include 2. 背景 准备 自动生成了 testng.xml 文件 已经基本了解了 testng.xml ...

  2. 修改eclipse工程jdk版本

    在eclipse中项目jdk版本不匹配的时候需要修改项目工程的jdk版本,但是网上的一些版本修改不是很完全,经过一些摸索之后,参考总结了我在项目中的具体配置实践 问题: 修改eclipse中的项目jd ...

  3. 深入delphi编程理解之消息(一)WINDOWS原生窗口编写及消息处理过程

    通过以sdk方式编制windows窗口程序,对理解windows消息驱动机制和delphi消息编程有很大的帮助. sdk编制windows窗口程序的步骤: 1.对TWndClass对象进行赋值; 2. ...

  4. 松软科技课堂:JavaScriptDOM - 改变 CSS

    HTML DOM 允许 JavaScript 更改 HTML 元素的样式. 改变 HTML 样式 如需更改 HTML 元素的样式,请使用此语法: document.getElementById(id) ...

  5. java 多线程并发问题

    问题:50个线程,先查询数据库的一个记录 t,然后对这个记录+1,最后更新到数据库 (更新的时候,不允许使用 update  test_concurrent set sum =sum -1 where ...

  6. JAVA基础学习(6)之使用对象

    6使用对象 6.1字符类型 6.1.1字符类型 char和int互相转换 //a比A大32 Scanner in=new Scanner(System.in); char c='B'; char c1 ...

  7. 201771010135 杨蓉庆《面对对象程序设计(java)》第十七周学习总结

    1.实验目的与要求 (1) 掌握线程同步的概念及实现技术: (2) 线程综合编程练习 一.理论知识 ⚫ 线程同步 (1)多线程并发运行不确定性问题解决方案:引入线 程同步机制,使得另一线程要使用该方法 ...

  8. <img>标签在vue中的使用

    定义和用法 onerror 事件会在文档或图像加载过程中发生错误时被触发. 在装载文档或图像的过程中如果发生了错误,就会调用该事件句柄. 实例 加载缩略图 <img :src="'/x ...

  9. 学习笔记(25)- NLP的几个概念

    NLP的几个概念 从技术研究的角度,简单介绍自然语言处理的几个概念 1. 对抗学习 主要指对抗生成网络. 2个主要构成:判别器.生成器 判别模型尽可能提取特征正确率增加的模型,生成模型尽可能" ...

  10. P1428

    AC: #include <stdio.h> #define rep(i, a, b) for(int i = a; i <= b; i++) #define min(a, b) ( ...