题目描述

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

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
  1. 题解:

运用线段树的算法。

这道题看似长度是变化的,其实可以转化

直接将序列看做1~m的数列,将数一个一个加入,并记录当前位置就行了

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

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

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

此题还可以用二分和单调栈

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. using namespace std;
  5. int M,D,t=;
  6. int size;
  7. int a[];
  8. int num[];
  9. int main()
  10. {
  11. int Ln,len=;
  12. char QA[];
  13. scanf("%d%d", &M, &D);
  14. while(M--)
  15. {
  16. scanf("%s %d", QA, &Ln);
  17. if(QA[] == 'A')//查询操作
  18. {
  19. Ln=(Ln+t)%D;
  20. num[++len]=Ln;//每次加入一个Ln,num数组长度++
  21. while(size&&num[a[size]]<=Ln)
  22. size--;//单调栈操作
  23. a[++size]=len;
  24. }
  25. else //插入操作
  26. {
  27. int pos=lower_bound(a+,a+size+,len-Ln+)-a; //二分查找
  28. t=num[a[pos]];
  29. cout<<t<<endl;
  30. }
  31. }
  32. return ;
  33. }

线段树

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. int c[],ans;
  6. void add(int rt,int l,int r,int p,int k)
  7. {
  8. if (l==r)
  9. {
  10. c[rt]=k;
  11. return;
  12. }
  13. int mid=(l+r)>>;
  14. if (p<=mid) add(rt<<,l,mid,p,k);
  15. else add(rt<<|,mid+,r,p,k);
  16. c[rt]=max(c[rt<<],c[rt<<|]);
  17. }
  18. int query(int rt,int l,int r,int L,int R)
  19. {
  20. if (l>=L&&r<=R)
  21. {
  22. return c[rt];
  23. }
  24. int mid=(l+r)>>,s=-;
  25. if (L<=mid) s=max(s,query(rt<<,l,mid,L,R));
  26. if (R>mid) s=max(s,query(rt<<|,mid+,r,L,R));
  27. return s;
  28. }
  29. void build(int rt,int l,int r)
  30. {
  31. c[rt]=-;
  32. if (l==r)return;
  33. int mid=(l+r)>>;
  34. build(rt<<,l,mid);build(rt<<|,mid+,r);
  35. }
  36. int main()
  37. {int n;
  38. char ch;
  39. int m,d,t,i,l;
  40. cin>>m>>d;
  41. t=;
  42. int x=;
  43. build(,,m);
  44. for (i=;i<=m;i++)
  45. {
  46. cin>>ch;
  47. if (ch=='A')
  48. {
  49. scanf("%d",&n);
  50. n=(n+t)%d;
  51. x++;
  52. add(,,m,x,n);
  53. }
  54. else
  55. {
  56. scanf("%d",&l);
  57. ans=query(,,m,x-l+,x);
  58. t=ans;
  59. printf("%d\n",ans);
  60. }
  61. }
  62. }

[JSOI2008]最大数的更多相关文章

  1. BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 8748  Solved: 3835[Submi ...

  2. BZOJ-1012[JSOI2008]最大数maxnumber 线段树区间最值

    这道题相对简单下面是题目: 1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MB Submit: 6542 Solve ...

  3. 洛谷P1198 [JSOI2008]最大数

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

  4. 【bzoj1012】[JSOI2008]最大数maxnumber

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 8339  Solved: 3624[Submi ...

  5. Cogs 1844. [JSOI2008]最大数maxnumber

    [JSOI2008]最大数maxnumber ★★ 输入文件:bzoj_1012.in 输出文件:bzoj_1012.out 简单对比 时间限制:3 s 内存限制:162 MB [题目描述] 现在请求 ...

  6. BZOJ 1012: [JSOI2008]最大数maxnumber【线段树单点更新求最值,单调队列,多解】

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 10374  Solved: 4535[Subm ...

  7. [JSOI2008]最大数maxnumber

    [JSOI2008]最大数maxnumber 标签: 线段树 单独队列 题目链接 题解 线段树裸题. 如果一直RE可能是你用的cin/cout. Code #include<cstdio> ...

  8. bzoj 1012: [JSOI2008]最大数maxnumber (线段树)

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 13081  Solved: 5654[Subm ...

  9. 洛谷 P1198 [JSOI2008]最大数

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

  10. BZOJ 1012: [JSOI2008]最大数maxnumber 单调队列/线段树/树状数组/乱搞

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 4750  Solved: 2145[Submi ...

随机推荐

  1. 论C++的智能指针

    一.简介   参考这篇博客,并且根据<C++ Primer>中相关知识,我总结了C++关于智能指针方面的内容.   为了解决内存泄漏的问题,便出现了智能指针.STL提供的智能指针有:aut ...

  2. python 面向对象之继承与派生

    一:初识继承 1,什么是继承? 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在python中,新建的类 ...

  3. 12-TypeScript总结

    从前面的文章大家可以看出,TypeScript具有先天的优势,建议前端开发人员使用TypeScript进行开发,提升自己的面向对象开发思想与能力.: 1.微软开源的客户端脚本语言,是JavaScrip ...

  4. auto_prepend_file与auto_append_file使用方法

    auto_prepend_file与auto_append_file使用方法 如果需要将文件require到所有页面的顶部与底部. 第一种方法:在所有页面的顶部与底部都加入require语句. 例如: ...

  5. python构造一个freebuf新闻发送脚本

    前言: 放假学习完web漏洞后.想写一个脚本 然而自己菜无法像大佬们一样写出牛逼的东西 尝试写了,都以失败告终. 还有一个原因:上学时间不能及时看到,自己也比较懒.邮件能提醒自己. 需要安装的模块: ...

  6. 手机PC监听用户复制内容

    最近应项目需求,为了获取到更多用户想要搜索的信息,需要把用户点击复制的内容获取到,然后传送给后台以更好的了解客户需求,自己在这个方法上栽了个大跟头,只考虑其一却不知道结合使用,脑袋卡顿,随笔记下,望自 ...

  7. SLF4J - 借助SLF4J, 统一适配所有日志实现为logback日志实现的实践

    一.屏蔽各种日志实现,去掉各种日志实现的实现依赖 二.引入slf4j和各种日志实现的适配器 1.引入slf4j 2.引入各种日志实现的适配器(适配到slf4j) 3.引入logback 引入logba ...

  8. maven常见问题处理(3-4)配置代理服务器

    有的公司基于安全因素考虑,要求员工使用通过安全认证的代理访问因特网. 这时就需要为Maven配置HTTP代理. 在目录~/.m2/setting.xml文件中编辑如下(如果没有该文件,则复制$M2_H ...

  9. Python入门之PyCharm的快捷键与常用设置和扩展(Win系统)

    1.  PyCharm的快捷键 2 . PyCharm的常用设置和扩展 ---------------------------------------------------------------- ...

  10. SQL优化(SQL TUNING)之10分钟完成亿级数据量性能优化(SQL调优)

    前几天,一个用户研发QQ找我,如下: 自由的海豚. 16:12:01 岛主,我的一条SQL查不出来结果,能帮我看看不? 兰花岛主 16:12:10 多久不出结果? 自由的海豚 16:12:17 多久都 ...