题目

P3709 大爷的字符串题

题意:求\([l,r]\)中众数的个数。

解析

维护两个数组:

  • \(cnt[x]\),数\(x\)出现的次数。
  • \(sum[x]\),出现次数为\(x\)的数的个数。

考虑往里添加元素时,直接取\(max\);

删除元素时,如果这个数是众数(\(cnt[x]==mode\))且众数只有这一个数(\(sum[cnt[x]]==1\)),众数个数就减一;

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 1e7 + 10;
  4. int n, m, mode;
  5. int a[N], b[N], cnt[N], sum[N], ans[N];
  6. class node {
  7. public :
  8. int l, r, id, bl;
  9. bool operator < (const node &oth) const {
  10. return this->bl == oth.bl ? this->r < oth.r : this->l < oth.l;
  11. }
  12. } e[N];
  13. template<class T>inline void read(T &x) {
  14. x = 0; int f = 0; char ch = getchar();
  15. while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
  16. while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  17. x = f ? -x : x;
  18. return;
  19. }
  20. inline void add(int x) {
  21. sum[cnt[a[x]]]--, sum[++cnt[a[x]]]++, mode = max(mode, cnt[a[x]]);
  22. //前两句是维护sum这个数出现的次数。
  23. }
  24. inline void del(int x) {
  25. if (cnt[a[x]] == mode && sum[cnt[a[x]]] == 1) mode--;
  26. sum[cnt[a[x]]]--;
  27. sum[--cnt[a[x]]]++;
  28. }
  29. int main() {
  30. read(n), read(m);
  31. int k = sqrt(n);
  32. for (int i = 1; i <= n; ++i) read(a[i]), b[i] = a[i];
  33. sort(b + 1, b + 1 + n);
  34. int len = unique(b + 1, b + 1 + n) - b - 1;
  35. for (int i = 1; i <= n; ++i) a[i] = lower_bound(b + 1, b + 1 + len, a[i]) - b;
  36. for (int i = 1, x, y; i <= m; ++i) {
  37. read(x), read(y);
  38. e[i] = (node) {x, y, i, x / k + 1};
  39. }
  40. sort(e + 1, e + 1 + m);
  41. int l = 1, r = 0;
  42. for (int i = 1; i <= m; ++i) {
  43. int ll = e[i].l, rr = e[i].r;
  44. while (l < ll) del(l++);
  45. while (l > ll) add(--l);
  46. while (r < rr) add(++r);
  47. while (r > rr) del(r--);
  48. ans[e[i].id] = mode;
  49. }
  50. for (int i = 1; i <= m; ++i) printf("%d\n", -ans[i]);
  51. return 0;
  52. }

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

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

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

  2. luogu P3709 大爷的字符串题

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

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

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

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

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

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

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

  6. P3709 大爷的字符串题(50分)

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

  7. P3709 大爷的字符串题

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

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

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

  9. 并不对劲的p3709:大爷的字符串题

    题目大意 区间众数 题解 莫队 代码 #include<algorithm> #include<cmath> #include<cstdio> #include&l ...

随机推荐

  1. Dubbo和Spring Cloud微服务架构'

    微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然微服务架构没有公认的技术标准和规范或者草案,但业 ...

  2. 如何利用GitHub设计一个炫酷的个人网站(含代码)

    1.在开始制作之前我们先预览一下我的网站吧! 1.方式一: 由于是手机版的所以用手机访问下面的链接体验比较好一点: https://tom-shushu.github.io/MyWeb.github. ...

  3. H5与C3权威指南笔记--box-shadow

    box-shadow 用于给盒子添加阴影效果.IE9+ 举个栗子:box-shadow: inset 5px 5px 5px red; inset可选,该值会让阴影出现在盒子内部. 第一个5px是阴影 ...

  4. webpack 样式表抽离成专门的单独文件并且设置版本号

    先以下的 css 的处理我们都把 mode 设置为 production. webpack4 开始使用: mini-css-extract-plugin插件, 1-3 的版本可以用: extract- ...

  5. java 设计模式 ---- 单例模式

    只产生一个实例, 所以要使用静态方法对外暴露对象(如果使用反射技术, 也能调用私有的构造方法) 懒汉模式 并发时还是可能会产生多个实例, 所以同步处理 public class User{ priva ...

  6. 微信小程序开发基础

    前言: 微信小程序开入入门,如果你有html+css+javascript的基础,那么你就很快地上手掌握的.下面提供微信小程序官方地址:https://developers.weixin.qq.com ...

  7. SqlServer如何给表添加新的字段以及字段注释

    语法: USE 数据库名ALTER TABLE 表名 ADD 字段名  类型  默认值  是否为空;EXEC sp_addextendedproperty N'MS_Description', N'注 ...

  8. html5 vedio 播放器,禁掉进度条快进快退事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. pytest生成测试报告-4种方法

    1.生成resultlog文件 2.生成JunitXML文件 3.生成html测试报告 > pip install pytest-html     # 通过pip安装pytest-html 4. ...

  10. WIFI KILL神器

    https://anky.cc/esp8266-deauther-wifi-jammer/ https://github.com/spacehuhn http://tieba.baidu.com/p/ ...