题目描述

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

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. find 报错 find: paths must precede expression:

    编写shell脚本,报错,如下面 [root@localhost backup]#find ./ -name mysqldump* -mtime +3 -delete [root@localhost ...

  2. Python常用数据类型转换

    常用的数据类型转换 目标 了解类型转换的作用 掌握常用的类型转换 函数 说明 int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 float(x ...

  3. 【C语言】在有序数组中插入一个数,保证它依然有序

    #include<stdio.h> int main() { ] = { ,,,,,, }; int key, i, j; printf("请输入一个数\n"); sc ...

  4. Innovus update_io_latency

    在Innovus中从ccopt 后的timing report中可以看到clock delay是从负值开始算起的,这个是因为在ccopt过程中进行了的update latency的动作. 基于bloc ...

  5. Redis-消息

    Redis 发布订阅(实际开发不使用) Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图 ...

  6. C++ explicit的作用

    explicit作用: 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. explicit使用注意事项: * e ...

  7. 【代码学习】PYTHON 生成器

    一.生成器 一遍循环一遍计算的机制,称为生成器 二.生成器的特点: 1.节约内存 2.迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的, ...

  8. SPOJ Distinct Substrings

    给定一个字符串,求不相同子串个数.每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同子串个数.总数为n*(n-1)/2,再减掉height[i]的和就是答案 #include< ...

  9. hibernate并发时的事务处理

    两个方法 方法一: public void saveTest() { try { System.out.println("saveTest start"); User user = ...

  10. Windows 10下一步一步创建 Scrapy框架的项目

    此文是本人的学习笔记,网上搜索了很多资料,也走了一些弯路,记录下安装的过程,以便日后回顾 1.安装Anaconda3,安装时默认选项 2.装完Anaconda3后,打开系统变量在path路径下增加An ...