其实已经学了树状数组和线段树,然而懒得做题,所以至今没写多少博客

Description

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

1、 查询操作。

语法:Q L

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

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

2、 插入操作。

语法:A n

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

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

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

Input&Output

Input

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

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

Output

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

Sample

Input

  1. 5 100
  2. A 96
  3. Q 1
  4. A 97
  5. Q 1
  6. Q 2

Output

  1. 96
  2. 93
  3. 96

Solution

  • 本来一开始打的线段树,但洛谷的加强数据T了最后一个点,所以改用了树状数组。因为只在队列末尾插入数据,所以其实线段树有点大材小用了。树状数组可以维护区间最大值,查询时通过不断更新ret即可。
  • 90分线段树(也可能是本蒟蒻太水了):

    1. #include<iostream>
    2. #include<cstdio>
    3. #include<algorithm>
    4. #define maxm 200001
    5. using namespace std;
    6. typedef long long ll;
    7. struct node{
    8. ll mx;
    9. int l,r,lc,rc;
    10. node(){
    11. lc=rc=-1;
    12. }
    13. }tree[maxm<<1];
    14. ll m,d,L,n,sum,t;
    15. char c;
    16. inline ll rd()
    17. {
    18. ll x=0;bool f=0;
    19. char c=getchar();
    20. while(c<'0'||c>'9'){
    21. if(c=='-')f=1;
    22. c=getchar();
    23. }
    24. while(c>='0'&&c<='9'){
    25. x=(x<<1)+(x<<3)+(c^48);
    26. c=getchar();
    27. }
    28. return f?-x:x;
    29. }
    30. int cnt;
    31. int rt=cnt++;
    32. void pushup(int cur)
    33. {
    34. int lc=tree[cur].lc,rc=tree[cur].rc;
    35. tree[cur].mx=max(tree[lc].mx,tree[rc].mx);
    36. tree[cur].l=tree[lc].l;
    37. tree[cur].r=tree[rc].r;
    38. }
    39. void build(int l,int r,int cur)
    40. {
    41. if(l==r){
    42. tree[cur].mx=0;
    43. tree[cur].l=tree[cur].r=l;
    44. return;
    45. }
    46. int mid=(l+r)>>1;
    47. tree[cur].lc=cnt++;
    48. tree[cur].rc=cnt++;
    49. build(l,mid,tree[cur].lc);
    50. build(mid+1,r,tree[cur].rc);
    51. pushup(cur);
    52. }
    53. void upd(int pos,ll c,int cur)
    54. {
    55. if(tree[cur].l==tree[cur].r)
    56. {
    57. tree[cur].mx=c;
    58. return;
    59. }
    60. int mid=(tree[cur].l+tree[cur].r)>>1;
    61. if(pos<=mid)upd(pos,c,tree[cur].lc);
    62. if(pos>mid)upd(pos,c,tree[cur].rc);
    63. pushup(cur);
    64. }
    65. ll query(int l,int r,int cur)
    66. {
    67. if(tree[cur].l>=l&&tree[cur].r<=r){
    68. return tree[cur].mx;
    69. }
    70. int mid=(tree[cur].l+tree[cur].r)>>1;
    71. ll mx=0;
    72. if(l<=mid)mx=max(mx,query(l,r,tree[cur].lc));
    73. if(r>mid)mx=max(mx,query(l,r,tree[cur].rc));
    74. return mx;
    75. }
    76. int main()
    77. {
    78. m=rd();
    79. d=rd();
    80. build(1,200000,rt);
    81. for(int i=1;i<=m;++i)
    82. {
    83. cin>>c;
    84. if(c=='Q'){
    85. L=rd();
    86. t=query(sum-L+1,sum,rt);
    87. printf("%d\n",t);
    88. }
    89. else if(c=='A'){
    90. n=rd();
    91. ll tmp=(n%d+t%d)%d;
    92. upd(sum+1,tmp,rt);
    93. sum++;
    94. }
    95. }
    96. return 0;
    97. }
  • 树状数组:

    1. #include<iostream>
    2. #include<cstdio>
    3. #include<algorithm>
    4. #define maxn 200005
    5. using namespace std;
    6. typedef long long ll;
    7. ll mx(ll a,ll b)
    8. {
    9. return (a>b)?a:b;
    10. }
    11. inline ll rd()
    12. {
    13. ll x=0;char c=getchar();
    14. bool f=false;
    15. while(c<'0'||c>'9'){
    16. if(c=='-')f=true;
    17. c=getchar();
    18. }
    19. while(c>='0'&&c<='9'){
    20. x=(x<<1)+(x<<3)+(c^48);
    21. c=getchar();
    22. }
    23. return f?-x:x;
    24. }
    25. ll b[maxn],d;
    26. int sum;
    27. int lowbit(int x)
    28. {
    29. return x&-x;
    30. }
    31. int add(ll v)
    32. {
    33. for(int x=sum;x;x-=lowbit(x))
    34. b[x]=mx(b[x],v);
    35. }
    36. int query(int pos)
    37. {
    38. ll ans=0;
    39. for(int x=sum-pos+1;x<=sum;x+=lowbit(x))
    40. ans=mx(ans,b[x]);
    41. return ans;
    42. }
    43. int main()
    44. {
    45. int m,p;
    46. char q;
    47. ll t=0;
    48. scanf("%d%lld",&m,&d);
    49. for(int i=1;i<=m;++i)
    50. {
    51. cin>>q;
    52. if(q=='A'){
    53. sum++;
    54. ll n;
    55. scanf("%lld",&n);
    56. add((n+t)%d);
    57. }
    58. else{
    59. scanf("%d",&p);
    60. t=query(p);
    61. printf("%lld\n",t);
    62. }
    63. }
    64. return 0;
    65. }

    写了快读居然没用上

[洛谷P1198/BZOJ1012][JSOI2008] 最大数 - 树状数组/线段树?的更多相关文章

  1. 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树

    正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...

  2. 树状数组 && 线段树应用 -- 求逆序数

    参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...

  3. hdu1394(枚举/树状数组/线段树单点更新&区间求和)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...

  4. hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. hdu 5147 Sequence II【树状数组/线段树】

    Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...

  6. 【洛谷4396/BZOJ3236】[AHOI2013]作业(莫队+分块/树状数组/线段树)

    题目: 洛谷4396 BZOJ3236(权限) 这题似乎BZOJ上数据强一些? 分析: 这题真的是--一言难尽 发现题面里没说权值的范围,怕出锅就写了离散化.后来经过面向数据编程(以及膜神犇代码)知道 ...

  7. 洛谷P2880 [USACO07JAN] Balanced Lineup G(树状数组/线段树)

    维护区间最值的模板题. 1.树状数组 1 #include<bits/stdc++.h> 2 //树状数组做法 3 using namespace std; 4 const int N=5 ...

  8. BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)

    题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...

  9. 数据结构--树状数组&&线段树--基本操作

    随笔目的:方便以后对树状数组(BIT)以及基本线段树的回顾 例题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 例题:hdu 1166 敌兵布阵 T ...

随机推荐

  1. 所使用的“EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”版本高于所引用的程序集“EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”的版本

    错误信息:所使用的"EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&qu ...

  2. 用于 SELECT 和 WHERE 子句的函数

    一个 SQL 语句中的 select_expression 或 where_definition 可由任何使用了下面所描述函数的表达式组成. 包含 NULL 的表达式总是得出一个 NULL 值结果,除 ...

  3. Flyway--数据库版本管理和控制工具

    1. Flyway 的主要任务是管理数据库的版本更新,在Flyway 中称每次数据库更新为一个migration ,为了更顺口,我们下面称之为数据库脚本.Flyway 支持SQL-based migr ...

  4. 4.Apache POI使用详解

    一.POI结构与常用类 1.POI介绍 Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. .NET的开发人 ...

  5. JavaScript(第十五天)【匿名函数和闭包】

      学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂.(所需基础15章的时候已经声明 ...

  6. 安装/或更新node和npm

    1.安装/或更新node和npm     安装node: node 的官网 nodejs.org 去下载 msi 安装包     更新npm: 使用命令  npm install npm@latest ...

  7. Alpha冲刺No.9

    一.站立式会议 继续解决真实手机中的问题,如果不能解决,请教助教学姐 数据库备忘录的获取和上传 细化界面设计 二.项目实际进展 用一种奇怪的方式解决了真实手机中的问题,在总结里细说. 完成数据库备忘录 ...

  8. 咸鱼翻身beta冲刺博客集

    咸鱼翻身beta冲刺博客集 凡事预则立-于Beta冲刺前 beta冲刺1-咸鱼 beta冲刺2-咸鱼 beta冲刺3-咸鱼 beta冲刺4-咸鱼 beta冲刺5-咸鱼 beta冲刺6-咸鱼 beta冲 ...

  9. Beta阶段敏捷冲刺报告-DAY2

    Beta阶段敏捷冲刺报告-DAY2 Scrum Meeting 敏捷开发日期 2017.11.3 会议时间 13:00 会议地点 微信群 参会人员 项目组全体成员 会议内容 打包问题修复, 爬虫优化, ...

  10. 从0开始的LeetCode生活—001-Two Sum

    题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...