To 洛谷.1198 最大数

题目描述

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

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行,每行一个字符串,描述一个具体的操作。语法如上文所述。

输出格式:

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

输入输出样例

输入样例#1:

  1. 5 100
  2. A 96
  3. Q 1
  4. A 97
  5. Q 1
  6. Q 2
输出样例#1:

  1. 96
  2. 93
  3. 96

说明

[JSOI2008]

思路:

  1.线段树。在初始建树时将所有节点赋值为-INF,操作和单点修改与区间最值并没有多少不同。

  2.单调队列+二分查找。

代码:

1.线段树  722ms/17.06MB,比方法2要慢近一倍。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #define LL long long
  4. using namespace std;
  5. const int N=,INF=1e9+;
  6.  
  7. int m,mod,len;
  8. LL t,Max[N<<];
  9.  
  10. void read(int &now)
  11. {
  12. now=;bool f=;char c=getchar();
  13. while(c<''||c>'')
  14. {
  15. if(c=='-')f=;
  16. c=getchar();
  17. }
  18. while(c>=''&&c<='')now=(now<<)+(now<<)+c-'',c=getchar();
  19. now= f?-now:now;
  20. }
  21.  
  22. void PushUp(int rt)
  23. {
  24. Max[rt]= Max[rt<<]<Max[rt<<|]?Max[rt<<|]:Max[rt<<];
  25. }
  26.  
  27. void Build(int l,int r,int rt)
  28. {
  29. if(l==r)
  30. {
  31. Max[rt]=-INF;
  32. return;
  33. }
  34. int m=(l+r)>>;
  35. Build(l,m,rt<<);
  36. Build(m+,r,rt<<|);
  37. PushUp(rt);
  38. }
  39.  
  40. void ModifyPoint(int l,int r,int rt,int p,int v)
  41. {
  42. if(l==r)
  43. {
  44. Max[rt]= Max[rt]<v?v:Max[rt];
  45. return;
  46. }
  47. int m=(l+r)>>;
  48. if(p<=m) ModifyPoint(l,m,rt<<,p,v);
  49. else ModifyPoint(m+,r,rt<<|,p,v);
  50. PushUp(rt);
  51. }
  52.  
  53. LL QueryMax(int l,int r,int rt,int L,int R)
  54. {
  55. if(L<=l && r<=R) return Max[rt];
  56. int m=(l+r)>>;
  57. LL res=-INF;
  58. if(L<=m) res=max(res,QueryMax(l,m,rt<<,L,R));
  59. if(m<R) res=max(res,QueryMax(m+,r,rt<<|,L,R));
  60. return res;
  61. }
  62.  
  63. int main()
  64. {
  65. read(m);read(mod);
  66. Build(,m,);
  67. for(int i=;i<=m;++i)
  68. {
  69. char opt[];int num;
  70. scanf("%s",opt);read(num);
  71. if(opt[]=='A')
  72. ModifyPoint(,m,,++len,(num+t)%mod);
  73. else
  74. printf("%lld\n",t=QueryMax(,m,,len-num+,len));
  75. }
  76. return ;
  77. }

线段树(插入元素 区间最值)

2.单调队列+lower_bound(+栈) 337ms/12.6MB

(先写 if(opt[0]=='Q')+询问 后写插入 就会错是什么鬼。。 哪位dalao看出来帮我指出一下。。thanks)

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const int N=;
  5.  
  6. int m,mod,len,size,t,Num[N],Stack[N];
  7.  
  8. void read(int &now)
  9. {
  10. now=;bool f=;char c=getchar();
  11. while(c<''||c>'')
  12. {
  13. if(c=='-')f=;
  14. c=getchar();
  15. }
  16. while(c>=''&&c<='')now=(now<<)+(now<<)+c-'',c=getchar();
  17. now= f?-now:now;
  18. }
  19.  
  20. /*int Mylower_bound(int s,int t,int p)
  21. {
  22. int l=s,r=t,m;
  23. while(l<r)
  24. {
  25. m=(l+r)>>1;
  26. if(Stack[m]<p)
  27. l=m+1;
  28. else if(Stack[m]==p)
  29. return m;
  30. else
  31. r=m;
  32. }
  33. return l;
  34. }*/
  35.  
  36. int main()
  37. {
  38. read(m);read(mod);
  39. char opt[];int a;
  40. while(m--)
  41. {
  42. scanf("%s",opt);read(a);
  43. if(opt[]=='A')
  44. {//因为比当前元素小的数在最后的求最大值中毫无作用,所以直接弹出
  45. a=(a+t)%mod;
  46. Num[++len]=a;
  47. while(size && Num[Stack[size]]<=a)
  48. --size;
  49. Stack[++size]=len;
  50. }
  51. else
  52. {//Stack[i]存储的是一个位置pos,且这些位置单调递增,这些位置对应的Num[pos]也单调递增
  53. int pos=lower_bound(Stack+,Stack+size+,len-a+)-Stack;//找出一个Stack中大于等于查询位置的pos
  54. //int pos=Mylower_bound(1,size,len-a+1);
  55. printf("%d\n",t=Num[Stack[pos]]);
  56. }
  57. }
  58. return ;
  59. }

单调队列

错误的写法

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const int N=;
  5.  
  6. int m,mod,len,size,t,Num[N],Stack[N];
  7.  
  8. void read(int &now)
  9. {
  10. now=;bool f=;char c=getchar();
  11. while(c<''||c>'')
  12. {
  13. if(c=='-')f=;
  14. c=getchar();
  15. }
  16. while(c>=''&&c<='')now=(now<<)+(now<<)+c-'',c=getchar();
  17. now= f?-now:now;
  18. }
  19.  
  20. int main()
  21. {
  22. read(m);read(mod);
  23. char opt[];int a;
  24. while(m--)
  25. {
  26. scanf("%s",opt);read(a);
  27. if(opt[]=='Q')
  28. {//Stack[i]存储的是一个位置,且这些位置单调递增,这些位置对应的Num[pos]也单调递增
  29. int pos=lower_bound(Stack+,Stack+size+,len-a+)-Stack;
  30. printf("%d\n",t=Num[pos]);
  31. }
  32. else
  33. {//因为比当前元素小的数在最后的求最大值中毫无作用,所以直接弹出
  34. a=(a+t)%mod;
  35. Num[++len]=a;
  36. while(size && Num[Stack[size]]<=a)
  37. --size;
  38. Stack[++size]=len;
  39. }
  40. }
  41. return ;
  42. }

0分

洛谷P1198 [JSOI2008]最大数(BZOJ.1012 )的更多相关文章

  1. 洛谷 P1198 [JSOI2008]最大数

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

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

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

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

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

  4. 洛谷P1198 [JSOI2008]最大数

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

  5. 【题解】洛谷P1198 [JSOI2008] 最大数(线段树)

    洛谷P1198:https://www.luogu.org/problemnew/show/P1198 思路 一道水水的线段树 20分钟A掉 这道题只涉及到单点修改和区间查询 所以这道题甚至不用Laz ...

  6. BZOJ——1012: [JSOI2008]最大数maxnumber || 洛谷—— P1198 [JSOI2008]最大数

    http://www.lydsy.com/JudgeOnline/problem.php?id=1012|| https://www.luogu.org/problem/show?pid=1198 T ...

  7. 洛谷 P1198 [JSOI2008]最大数 Label:线段树

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

  8. 洛谷 P1198 [JSOI2008]最大数——单调栈/线段树

    先上一波题目 https://www.luogu.org/problem/P1198 题目要求维护后缀最大值 以及在数列的最后面添加一个数 这道题呢我们有两种做法 1.单调栈 因为只需要维护后缀最大值 ...

  9. 洛谷P1198 [JSOI2008]最大数(线段树/单调栈)

    题目链接: https://www.luogu.org/problemnew/show/P1198 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询 ...

随机推荐

  1. c++动态库封装及调用(3、windows下动态库调用)

    1.DLL的隐式调用 隐式链接采用静态加载的方式,比较简单,需要.h..lib..dll三件套.新建“控制台应用程序”或“空项目”.配置如下: 项目->属性->配置属性->VC++ ...

  2. ftruncate(改变文件大小)

    ftruncate(改变文件大小) 定义函数 int ftruncate(int fd,off_t length); 函数说明 ftruncate()会将参数fd指定的文件大小改为参数length指定 ...

  3. MySQL日志——Undo | Redo【转】

    本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版 ...

  4. kafka系列一、kafka安装及部署、集群搭建

    一.环境准备 操作系统:Cent OS 7 Kafka版本:kafka_2.10 Kafka官网下载:请点击 JDK版本:1.8.0_171 zookeeper-3.4.10 二.kafka安装配置 ...

  5. web服务器tomcat入门实战

    一.tomcat介绍1.1 引入tomcat Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Su ...

  6. centos重启报错Umounting file systems:umount:/opt:device is busy

    系统重启报错: Umounting file systems:umount:/opt:device is busy 只能硬关机,回想一下最近刚安装了nod32 for linux x64的杀毒软件,开 ...

  7. Android中PopupWindow用法

    参考资料链接:http://developer.android.com/reference/android/widget/PopupWindow.html 在Android中有很多级别的Window, ...

  8. 如何查看centos系统cpu/内存使用情况

    1.查看硬盘 [mushme@investide ~]$ df -ah 文件系统              容量  已用 可用 已用% 挂载点 /dev/cciss/c0d0p1     123G   ...

  9. cf 1041C双指针

    比赛的时候想着用单调队列做... 打完发现其实就是个双指针 /* 构造双指针解决即可 */ #include<iostream> #include<cstring> #incl ...

  10. 性能测试二十二:环境部署之Nginx

    由于单纯用tomcat只能通过ip+端口号的形式访问,这样只能访问一个tomcat,而真实项目中又不可能只用一两个tomcat,所以就需要Nginx来进行分配访问请求, Nginx本身性能非常好,据官 ...