题目背景

在那遥远的西南有一所学校

/*被和谐部分*/

然后去参加该省省选虐场

然后某蒟蒻不会做,所以也出了一个字符串题:

题目描述

给你一个字符串a,每次询问一段区间的贡献

贡献定义:

每次从这个区间中随机拿出一个字符x,然后把x从这个区间中删除,你要维护一个集合S

如果S为空,你rp减1

如果S中有一个元素不小于x,则你rp减1,清空S

之后将x插入S

由于你是大爷,平时做过的题考试都会考到,所以每次询问你搞完这段区间的字符之后最多还有多少rp?rp初始为0

询问之间不互相影响~

输入输出格式

输入格式:

第一行两个数n,m,表示字符串长度与询问次数

之后一行n个数,表示字符串

由于你是大爷,所以字符集1e9

之后m行每行两个数,表示询问的左右区间

输出格式:

m行,每行一个数表示答案

输入输出样例

输入样例#1:

  1. 3 3
  2. 3 3 3
  3. 3 3
  4. 3 3
  5. 3 3
输出样例#1:

  1. -1
  2. -1
  3. -1

说明

前4个点1s,后面的点4s

对于10%的数据,是样例

对于另外10%的数据,n,m <= 100

对于另外10%的数据,n,m <= 1000

对于另外10%的数据,n,m <= 10000

对于另外10%的数据,n,m <= 100000

对于100%的数据,n,m <= 200000

保证数据向某省省选day1T2一样sb,大家尽情用暴力水过题吧!

没事,你只要在一个好学校,就算这题只能拿到10分,也可以进队了

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<cstdlib>
  6. #include<algorithm>
  7. #include<vector>
  8. #define hh 10
  9. using namespace std;
  10. const int MAXN=;
  11. void read(int & n)
  12. {
  13. char c='+';int x=;bool flag=;
  14. while(c<''||c>'')
  15. {c=getchar();if(c=='-')flag=;}
  16. while(c>=''&&c<='')
  17. {x=x*+(c-);c=getchar();}
  18. flag==?n=-x:n=x;
  19. }
  20. int n,m;
  21. int pos[MAXN];
  22. int base;
  23. int rp=;
  24. struct node
  25. {
  26. int l,r,id;
  27. }q[MAXN];
  28. struct dr
  29. {
  30. int a,p;
  31. }a[MAXN];
  32. int comp(const node & a,const node &b)
  33. {
  34. if(pos[a.l]==pos[b.l])
  35. return a.r<b.r;
  36. else
  37. return pos[a.l]<pos[b.l];
  38. }
  39. int cop(const dr &a,const dr &b)
  40. {
  41. return (a.a<b.a)||(a.a==b.a&&a.p<b.p);
  42. }
  43. int happen[MAXN];// 记录i出现了多少次
  44. int cnt[MAXN];// 记录出现次数为j的有多少
  45. int out[MAXN];
  46. void dele(int p)
  47. {
  48. if(rp==happen[p]&&cnt[happen[p]+hh]==)
  49. rp--;
  50. cnt[happen[p]+hh]--;
  51. cnt[happen[p]+hh-]++;
  52. happen[p]--;
  53. }
  54. void add(int p)
  55. {
  56. if(rp==happen[p])
  57. rp++;
  58. cnt[happen[p]+hh]--;
  59. cnt[happen[p]+hh+]++;
  60. happen[p]++;
  61. }
  62. int ls[MAXN];
  63. void modui()
  64. {
  65. int ll=,rr=;
  66. for(int i=;i<=m;i++)
  67. {
  68. for(;ll<q[i].l;ll++)
  69. dele(ls[ll]);
  70. for(;ll>q[i].l;ll--)
  71. add(ls[ll-]);
  72. for(;rr>q[i].r;rr--)
  73. dele(ls[rr]);
  74. for(;rr<q[i].r;rr++)
  75. add(ls[rr+]);
  76. out[q[i].id]=-rp;
  77. }
  78. for(int i=;i<=m;i++)
  79. printf("%d\n",out[i]);
  80. }
  81. int main()
  82. {
  83. read(n);read(m);
  84. base=sqrt(n);
  85. for(int i=;i<=n;i++)
  86. read(a[i].a),a[i].p=i;
  87. sort(a+,a+n+,cop);
  88. int j;
  89. for(int i=,j=;i<=n;i++)
  90. {
  91. if (i==||a[i].a!=a[i-].a) j++;
  92. ls[a[i].p]=j;
  93. }
  94. //for(int i=1;i<=n;i++)
  95. // pos[i]=(i-1)/base+1;
  96. int sqt=;
  97. for ( sqt=; sqt*sqt<=n; sqt++);
  98.  
  99. for (int i=; i<=n; i++) pos[i]=i/sqt;
  100.  
  101. cnt[]=j;
  102. for(int i=;i<=m;i++)
  103. {
  104. read(q[i].l);
  105. read(q[i].r);
  106. q[i].id=i;
  107. }
  108. sort(q+,q+m+,comp);
  109. modui();
  110. return ;
  111. }

P3709 大爷的字符串题(50分)的更多相关文章

  1. P3709 大爷的字符串题 (莫队)

    题目 P3709 大爷的字符串题 题意:求\([l,r]\)中众数的个数. 解析 维护两个数组: \(cnt[x]\),数\(x\)出现的次数. \(sum[x]\),出现次数为\(x\)的数的个数. ...

  2. P3709 大爷的字符串题(莫队+结论)

    题目 P3709 大爷的字符串题 做法 有一个显然的结论:一段区间里最小答案为众数的个数 用莫队来离线求众数 \(tmp_i\)表示出现\(i\)次的数的个数,\(num_i\)表示\(i\)出现的次 ...

  3. luogu P3709 大爷的字符串题

    二次联通门 : luogu P3709 大爷的字符串题 /* luogu P3709 大爷的字符串题 莫队 看了半天题目 + 题解 才弄懂了要求什么... 维护两个数组 一个记录数字i出现了几次 一个 ...

  4. 洛谷 P3709 大爷的字符串题

    https://www.luogu.org/problem/show?pid=3709 题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个 ...

  5. 洛谷P3709 大爷的字符串题(莫队)

    题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区 ...

  6. P3709 大爷的字符串题

    题意 询问区间众数出现的次数 思路 唯有水题快人心 离散化+莫队 莫队一定要先加后减,有事会出错的 莫队维护区间众数: 维护两个数组,一个数组记录权值为x的出现次数,一个记录出现次数为x的数的个数 a ...

  7. 【题解】洛谷P3709大爷的字符串题

    最近想要练习一下莫队(实在是掌握的太不熟练了啊.)这题一开始看到有点懵(题面杀),后来发现是要求众数的个数.乍一看好像很难的样子. 但仔细分析一下:首先往序列当中加入一个数,这个是很简单的,只需要维护 ...

  8. 【luogu P3709 大爷的字符串题】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3709 离散化+区间众数..? #include <iostream> #include < ...

  9. 【Luogu】P3709大爷的字符串题(莫队算法)

    题目链接 语文题啊…… 看题解发现是让求区间中最多的数的个数,于是果断理解了一会题解……莫队套上完事. sum[i]表示i这个数出现的次数,cnt[i]表示出现i次的数有几个,然后乱搞搞……就好了 # ...

随机推荐

  1. SSH远程执行命令环境变量问题

    SSH命令格式 usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address: ...

  2. 用fallocate进行"文件预留"或"文件打洞"【转】

    转自uestc-leon的博客 内容作了一些修改,查看原文请访问uestc-leon 1. 什么是空洞文件? "在UNIX文件操作中,文件位移量可以大于文件的当前长度,在这种情况下,对该文件 ...

  3. 【Codeforces 474D】Flowers

    [链接] 我是链接,点我呀:) [题意] 让你吃东西 B食物一次必须要吃连续k个 但是对A食物没有要求 问你有多少种吃n个食物的方法(吃的序列) [题解] 设f[i]表示长度为i的吃的序列且符合要求的 ...

  4. [JZOJ4687]奇袭

    [JZOJ4687]奇袭 题目 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上要迎来最终的压力测试——魔界入侵. 唯一一个神一般存在的Administrator被消灭 ...

  5. noip模拟赛 三部曲

    分析:子树上操作,要用到线段树+dfs序,关键就是子树内k还要增加,这个就不是很好办.可以求出在根节点+0后每个点会加多少,记为d[i],如果要对点x进行A操作,实际上只需要对子树加k - d[i]再 ...

  6. CPU工作原理简图

  7. Clojure:将两个list合并成一个map

    假设我们有两个list,分别是: (def a [“one” “two” “three”]) (def b [1 2 3]) 我们要把它们合为一个键值对应的map,做法很简单: 1. 先将a和b合为一 ...

  8. AngularJS:实现页面滚动到底自动加载数据的功能

    要实现这个功能,可以通过https://github.com/sroze/ngInfiniteScroll这个第三方控件来实现.步骤如下: 1. 下载ng-infinite-scroll.js程序ht ...

  9. AspNet MVC4 教学-27:Asp.Net MVC4 自己定义helper及function的高速Demo

    A.创建Basic类型项目. B.创建App_Code目录,在里面创建2个cshtml文件: MyHelper.cshtml: @helper MyTruncate(string input, int ...

  10. Ambari-部署常见问题

    重新启动ambari-server端后调用install.start API后返回200 导致该问题的解决办法是server在启动后没有收到agent的心跳即没有与agent建立连接,在此时进行API ...