P1198 [JSOI2008]最大数(线段树)

题目描述

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

1、 查询操作。

语法:Q L

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

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

2、 插入操作。

语法:A n

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

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

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

输入输出格式

输入格式:

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

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

输出格式:

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

输入输出样例

输入样例#1: 复制

5 100
A 96
Q 1
A 97
Q 1
Q 2
输出样例#1: 复制

96
93
96

说明

[JSOI2008]

本题数据已加强

分析解答:

这个题目线段树,树状数组,单调栈,分块等方法都可以做;

核心是查找一串数中的最大值。

下面是线段树的解法:

这道题并不需要提前建树,只要按照输入的顺序挨个添加就好啦

要是不会线段树的话,可以先去看一下线段树模板1

运用线段树的算法。首先建树,把所有的节点的值赋成min_int。用[i,j]表示该区间的最大值。

1)读入Q L操作。用len表示区间的大小,在len+1的位置放入(L+T)%D的值。

2)读入A n操作。输出区间[len-n+1,len]这个区间中的最大值,并把t的值进行更新。

得分:100

时间复杂度:O(nlogn)

空间复杂度:O(4*n)

next数组把所有叶子节点的位置都找到了

 #include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct tree
{
int l,r,_max;//左右边界和最大值
}a[];//4倍空间
int n,m,d,x,t,next[];
//建树
void make_tree(int x,int l,int r)
{
a[x].l=l;
a[x].r=r;
//叶子节点
if(l==r)
{
//这里x是root
//next里面记录的是所有叶子节点的位置,或者说编号
next[l]=x;
return;
//这里本来是要做数据的初始化的,但是因为现在数据还没加进来,做不了
}
int mid=(l+r)/;
//左右子树
make_tree(x*,l,mid);
make_tree(x*+,mid+,r);
}
void add(int x)
{
a[next[++n]]._max=(x+t)%d;//这一步就是做叶子节点数据的初始化
//本来n是0,第一个数是8的位置,那就插到8的位置就好
int temp=next[n];
//节点发生改变,肯定要更新父亲节点
//比如说第一个节点的位置是8,那么temp就是从8 4 2 1,这样一直更新到root节点
while(a[temp]._max>a[temp/]._max)//子节点大于父亲节点才更新
{
//无论是左右孩子,除2都可以得到父亲
a[temp/]._max=a[temp]._max;
temp=temp/;
}
}
//查询操作 ,这里的x是根节点 ,y是左边界 ,y是我们要查询的边界的左边界
int q(int x,int y)
{
//包含的情况,因为求最后几个,右边界是固定的
if(a[x].l>=y) return a[x]._max;
//没有相交的情况
if(a[x].r<y) return ;
//相交又不包含的情况
//左右孩子中的大值
return max(q(x*,y),q(x*+,y));
}
void print(int m){
cout<<"i"<<" "<<"next[i]"<<" "<<endl;
for(int i=;i<=*m;i++){
cout<<i<<" "<<next[i]<<" "<<endl;
}
}
int main()
{
// freopen("in.txt","r",stdin);
cin>>m>>d;
a[].l=;
a[].r=m;
//这里就是左+右除2
make_tree(,,(m+)/);
make_tree(,(m+)/+,m);
// print(m);
for(int i=;i<=m;i++)
{
char ch;
cin>>ch;
cin>>x;
//插入操作
if(ch=='A') add(x);
if(ch=='Q')
{
//查询操作,比如x是2,比如5个操作,因为进行了两次插入操作,所以n就是2,q(1,2-2+1)
//这里的1是root,而n-x+1是我们要查询的左边界,因为右边界不用管
t=q(,n-x+);
cout<<t<<endl;
}
}
// print(m);
}

P1198 [JSOI2008]最大数(线段树)的更多相关文章

  1. [JSOI2008]最大数 (线段树)

    题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当前数列的长度.(L>=0 ...

  2. [JSOI2008]最大数 线段树解法

    题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当前数列的长度. 2. 插入操作 ...

  3. BZOJ1012 [JSOI2008]最大数 线段树

    题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:LLL不超过当前数列的长度.(L> ...

  4. P1198 [JSOI2008]最大数【树状数组】

    题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制: L 不超过当前数列的长度. (L &g ...

  5. P1198 [JSOI2008]最大数(线段树基础)

    P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制: ...

  6. 「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数

    「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数 题面描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数, ...

  7. 洛谷P1198 [JSOI2008]最大数

    P1198 [JSOI2008]最大数 267通过 1.2K提交 题目提供者该用户不存在 标签线段树各省省选 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 WA80的戳这QwQ BZOJ都 ...

  8. 洛谷 P1198 [JSOI2008]最大数

    洛谷 P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. ...

  9. 洛谷P1198 [JSOI2008]最大数(单点修改,区间查询)

    洛谷P1198 [JSOI2008]最大数 简单的线段树单点问题. 问题:读入A和Q时,按照读入一个字符会MLE,换成读入字符串就可以了. #include<bits/stdc++.h> ...

随机推荐

  1. thinkphp 5.0整合阿里大于验证码短信发送接口,含完整模型验证实例DEMO

    为大家分享一个阿里大于短信发送接口: 首先创建一个发送模型(Send.php): <?php namespace app\index\model; use think\Validate; cla ...

  2. Linux命令学习(4):gzip压缩与解压

    版权声明:本文为博主原创文章,未经允许不得转载 引子 gzip是Linux系统中最常用也是高效的压缩压缩命令.早期Linux系统中主要使用compress命令压缩,得到后缀为“.Z”的压缩文件,但是后 ...

  3. 升级到Offiec 2016后 Power View 不见了的处理方法

    好吧 并不是没有了,而只是快捷方式需要手动的调整出来, 过程还是挺复杂,给一个官方文档吧. Turn on Power View in Excel 2016 for Windows https://s ...

  4. java的动态代理机制详解-----https://www.cnblogs.com/xiaoluo501395377/p/3383130.html

    java的动态代理机制详解-----https://www.cnblogs.com/xiaoluo501395377/p/3383130.html

  5. hihoCoder#1036 Trie图

    原题地址 看了这篇博文,总算是把Trie图弄明白了 Runtime Error了无数次,一直不知道为什么,于是写了个脚本生成了一组大数据,发现果然段错误了. 调试了一下午,总算闹明白了,为什么呢? 1 ...

  6. Python模块:shutil、序列化(json&pickle&shelve)、xml

    shutil模块: 高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fscr,fdst [, length])   # 将文件内容拷贝到另一个文件中 import shu ...

  7. [K/3Cloud] 分录行复制和新增行的冲突如何处理

    新增行:执行AfterCreateNewEntryRow,这个函数里面对一些数据进行处理(比如字段给上默认值): 复制行:复制行过程中希望这些字段能够得到我修改行信息后的数据,如果不处理,执行到Aft ...

  8. UVA 1025_A Spy in the Metro

    [题意](小紫书)一个人从站台1出发,乘车要在时刻T到达站台n,为使在站台等车时间最短,她可以选择乘坐两个方向的列车,并在客车停靠站的时候换车. [分析]每次停站下车时,她都有三种选择,1.原地不动 ...

  9. Java DynamoDB 增加、删除、修改、查询

    准备jar包 <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sd ...

  10. 第一个Spring程序(DI的实现)

    一,依赖注入:Dependency Injection(DI)与控制反转(IoC),不同角度但是同一个概念.首先我们理解一点在传统方式中我们使用new的方式来创建一个对象,这会造成对象与被实例化的对象 ...