洛谷P1198 [JSOI2008]最大数(BZOJ.1012 )
题目描述
现在请求你维护一个数列,要求提供以下两种操作:
1、 查询操作。
语法:Q L
功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值。
限制:L不超过当前数列的长度。
2、 插入操作。
语法:A n
功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾。
限制:n是整数(可能为负数)并且在长整范围内。
注意:初始时数列是空的,没有一个数。
输入输出格式
输入格式:
第一行两个整数,M和D,其中M表示操作的个数(M <= 200,000),D如上文中所述,满足(0<D<2,000,000,000)
接下来的M行,每行一个字符串,描述一个具体的操作。语法如上文所述。
输出格式:
对于每一个查询操作,你应该按照顺序依次输出结果,每个结果占一行。
输入输出样例
- 5 100
- A 96
- Q 1
- A 97
- Q 1
- Q 2
- 96
- 93
- 96
说明
[JSOI2008]
思路:
1.线段树。在初始建树时将所有节点赋值为-INF,操作和单点修改与区间最值并没有多少不同。
2.单调队列+二分查找。
代码:
1.线段树 722ms/17.06MB,比方法2要慢近一倍。
- #include<cstdio>
- #include<algorithm>
- #define LL long long
- using namespace std;
- const int N=,INF=1e9+;
- int m,mod,len;
- LL t,Max[N<<];
- void read(int &now)
- {
- now=;bool f=;char c=getchar();
- while(c<''||c>'')
- {
- if(c=='-')f=;
- c=getchar();
- }
- while(c>=''&&c<='')now=(now<<)+(now<<)+c-'',c=getchar();
- now= f?-now:now;
- }
- void PushUp(int rt)
- {
- Max[rt]= Max[rt<<]<Max[rt<<|]?Max[rt<<|]:Max[rt<<];
- }
- void Build(int l,int r,int rt)
- {
- if(l==r)
- {
- Max[rt]=-INF;
- return;
- }
- int m=(l+r)>>;
- Build(l,m,rt<<);
- Build(m+,r,rt<<|);
- PushUp(rt);
- }
- void ModifyPoint(int l,int r,int rt,int p,int v)
- {
- if(l==r)
- {
- Max[rt]= Max[rt]<v?v:Max[rt];
- return;
- }
- int m=(l+r)>>;
- if(p<=m) ModifyPoint(l,m,rt<<,p,v);
- else ModifyPoint(m+,r,rt<<|,p,v);
- PushUp(rt);
- }
- LL QueryMax(int l,int r,int rt,int L,int R)
- {
- if(L<=l && r<=R) return Max[rt];
- int m=(l+r)>>;
- LL res=-INF;
- if(L<=m) res=max(res,QueryMax(l,m,rt<<,L,R));
- if(m<R) res=max(res,QueryMax(m+,r,rt<<|,L,R));
- return res;
- }
- int main()
- {
- read(m);read(mod);
- Build(,m,);
- for(int i=;i<=m;++i)
- {
- char opt[];int num;
- scanf("%s",opt);read(num);
- if(opt[]=='A')
- ModifyPoint(,m,,++len,(num+t)%mod);
- else
- printf("%lld\n",t=QueryMax(,m,,len-num+,len));
- }
- return ;
- }
线段树(插入元素 区间最值)
2.单调队列+lower_bound(+栈) 337ms/12.6MB
(先写 if(opt[0]=='Q')+询问 后写插入 就会错是什么鬼。。 哪位dalao看出来帮我指出一下。。thanks)
- #include<cstdio>
- #include<algorithm>
- using namespace std;
- const int N=;
- int m,mod,len,size,t,Num[N],Stack[N];
- void read(int &now)
- {
- now=;bool f=;char c=getchar();
- while(c<''||c>'')
- {
- if(c=='-')f=;
- c=getchar();
- }
- while(c>=''&&c<='')now=(now<<)+(now<<)+c-'',c=getchar();
- now= f?-now:now;
- }
- /*int Mylower_bound(int s,int t,int p)
- {
- int l=s,r=t,m;
- while(l<r)
- {
- m=(l+r)>>1;
- if(Stack[m]<p)
- l=m+1;
- else if(Stack[m]==p)
- return m;
- else
- r=m;
- }
- return l;
- }*/
- int main()
- {
- read(m);read(mod);
- char opt[];int a;
- while(m--)
- {
- scanf("%s",opt);read(a);
- if(opt[]=='A')
- {//因为比当前元素小的数在最后的求最大值中毫无作用,所以直接弹出
- a=(a+t)%mod;
- Num[++len]=a;
- while(size && Num[Stack[size]]<=a)
- --size;
- Stack[++size]=len;
- }
- else
- {//Stack[i]存储的是一个位置pos,且这些位置单调递增,这些位置对应的Num[pos]也单调递增
- int pos=lower_bound(Stack+,Stack+size+,len-a+)-Stack;//找出一个Stack中大于等于查询位置的pos
- //int pos=Mylower_bound(1,size,len-a+1);
- printf("%d\n",t=Num[Stack[pos]]);
- }
- }
- return ;
- }
单调队列
错误的写法
- #include<cstdio>
- #include<algorithm>
- using namespace std;
- const int N=;
- int m,mod,len,size,t,Num[N],Stack[N];
- void read(int &now)
- {
- now=;bool f=;char c=getchar();
- while(c<''||c>'')
- {
- if(c=='-')f=;
- c=getchar();
- }
- while(c>=''&&c<='')now=(now<<)+(now<<)+c-'',c=getchar();
- now= f?-now:now;
- }
- int main()
- {
- read(m);read(mod);
- char opt[];int a;
- while(m--)
- {
- scanf("%s",opt);read(a);
- if(opt[]=='Q')
- {//Stack[i]存储的是一个位置,且这些位置单调递增,这些位置对应的Num[pos]也单调递增
- int pos=lower_bound(Stack+,Stack+size+,len-a+)-Stack;
- printf("%d\n",t=Num[pos]);
- }
- else
- {//因为比当前元素小的数在最后的求最大值中毫无作用,所以直接弹出
- a=(a+t)%mod;
- Num[++len]=a;
- while(size && Num[Stack[size]]<=a)
- --size;
- Stack[++size]=len;
- }
- }
- return ;
- }
0分
洛谷P1198 [JSOI2008]最大数(BZOJ.1012 )的更多相关文章
- 洛谷 P1198 [JSOI2008]最大数
洛谷 P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. ...
- 洛谷P1198 [JSOI2008]最大数(单点修改,区间查询)
洛谷P1198 [JSOI2008]最大数 简单的线段树单点问题. 问题:读入A和Q时,按照读入一个字符会MLE,换成读入字符串就可以了. #include<bits/stdc++.h> ...
- 「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数
「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数 题面描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数, ...
- 洛谷P1198 [JSOI2008]最大数
P1198 [JSOI2008]最大数 267通过 1.2K提交 题目提供者该用户不存在 标签线段树各省省选 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 WA80的戳这QwQ BZOJ都 ...
- 【题解】洛谷P1198 [JSOI2008] 最大数(线段树)
洛谷P1198:https://www.luogu.org/problemnew/show/P1198 思路 一道水水的线段树 20分钟A掉 这道题只涉及到单点修改和区间查询 所以这道题甚至不用Laz ...
- BZOJ——1012: [JSOI2008]最大数maxnumber || 洛谷—— P1198 [JSOI2008]最大数
http://www.lydsy.com/JudgeOnline/problem.php?id=1012|| https://www.luogu.org/problem/show?pid=1198 T ...
- 洛谷 P1198 [JSOI2008]最大数 Label:线段树
题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当前数列的长度. 2. 插入操作 ...
- 洛谷 P1198 [JSOI2008]最大数——单调栈/线段树
先上一波题目 https://www.luogu.org/problem/P1198 题目要求维护后缀最大值 以及在数列的最后面添加一个数 这道题呢我们有两种做法 1.单调栈 因为只需要维护后缀最大值 ...
- 洛谷P1198 [JSOI2008]最大数(线段树/单调栈)
题目链接: https://www.luogu.org/problemnew/show/P1198 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询 ...
随机推荐
- c++动态库封装及调用(3、windows下动态库调用)
1.DLL的隐式调用 隐式链接采用静态加载的方式,比较简单,需要.h..lib..dll三件套.新建“控制台应用程序”或“空项目”.配置如下: 项目->属性->配置属性->VC++ ...
- ftruncate(改变文件大小)
ftruncate(改变文件大小) 定义函数 int ftruncate(int fd,off_t length); 函数说明 ftruncate()会将参数fd指定的文件大小改为参数length指定 ...
- MySQL日志——Undo | Redo【转】
本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版 ...
- kafka系列一、kafka安装及部署、集群搭建
一.环境准备 操作系统:Cent OS 7 Kafka版本:kafka_2.10 Kafka官网下载:请点击 JDK版本:1.8.0_171 zookeeper-3.4.10 二.kafka安装配置 ...
- web服务器tomcat入门实战
一.tomcat介绍1.1 引入tomcat Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Su ...
- centos重启报错Umounting file systems:umount:/opt:device is busy
系统重启报错: Umounting file systems:umount:/opt:device is busy 只能硬关机,回想一下最近刚安装了nod32 for linux x64的杀毒软件,开 ...
- Android中PopupWindow用法
参考资料链接:http://developer.android.com/reference/android/widget/PopupWindow.html 在Android中有很多级别的Window, ...
- 如何查看centos系统cpu/内存使用情况
1.查看硬盘 [mushme@investide ~]$ df -ah 文件系统 容量 已用 可用 已用% 挂载点 /dev/cciss/c0d0p1 123G ...
- cf 1041C双指针
比赛的时候想着用单调队列做... 打完发现其实就是个双指针 /* 构造双指针解决即可 */ #include<iostream> #include<cstring> #incl ...
- 性能测试二十二:环境部署之Nginx
由于单纯用tomcat只能通过ip+端口号的形式访问,这样只能访问一个tomcat,而真实项目中又不可能只用一两个tomcat,所以就需要Nginx来进行分配访问请求, Nginx本身性能非常好,据官 ...