P3709 大爷的字符串题 (莫队)
题目
P3709 大爷的字符串题
题意:求\([l,r]\)中众数的个数。
解析
维护两个数组:
- \(cnt[x]\),数\(x\)出现的次数。
- \(sum[x]\),出现次数为\(x\)的数的个数。
考虑往里添加元素时,直接取\(max\);
删除元素时,如果这个数是众数(\(cnt[x]==mode\))且众数只有这一个数(\(sum[cnt[x]]==1\)),众数个数就减一;
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e7 + 10;
int n, m, mode;
int a[N], b[N], cnt[N], sum[N], ans[N];
class node {
public :
int l, r, id, bl;
bool operator < (const node &oth) const {
return this->bl == oth.bl ? this->r < oth.r : this->l < oth.l;
}
} e[N];
template<class T>inline void read(T &x) {
x = 0; int f = 0; char ch = getchar();
while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
x = f ? -x : x;
return;
}
inline void add(int x) {
sum[cnt[a[x]]]--, sum[++cnt[a[x]]]++, mode = max(mode, cnt[a[x]]);
//前两句是维护sum这个数出现的次数。
}
inline void del(int x) {
if (cnt[a[x]] == mode && sum[cnt[a[x]]] == 1) mode--;
sum[cnt[a[x]]]--;
sum[--cnt[a[x]]]++;
}
int main() {
read(n), read(m);
int k = sqrt(n);
for (int i = 1; i <= n; ++i) read(a[i]), b[i] = a[i];
sort(b + 1, b + 1 + n);
int len = unique(b + 1, b + 1 + n) - b - 1;
for (int i = 1; i <= n; ++i) a[i] = lower_bound(b + 1, b + 1 + len, a[i]) - b;
for (int i = 1, x, y; i <= m; ++i) {
read(x), read(y);
e[i] = (node) {x, y, i, x / k + 1};
}
sort(e + 1, e + 1 + m);
int l = 1, r = 0;
for (int i = 1; i <= m; ++i) {
int ll = e[i].l, rr = e[i].r;
while (l < ll) del(l++);
while (l > ll) add(--l);
while (r < rr) add(++r);
while (r > rr) del(r--);
ans[e[i].id] = mode;
}
for (int i = 1; i <= m; ++i) printf("%d\n", -ans[i]);
return 0;
}
P3709 大爷的字符串题 (莫队)的更多相关文章
- P3709 大爷的字符串题(莫队+结论)
题目 P3709 大爷的字符串题 做法 有一个显然的结论:一段区间里最小答案为众数的个数 用莫队来离线求众数 \(tmp_i\)表示出现\(i\)次的数的个数,\(num_i\)表示\(i\)出现的次 ...
- luogu P3709 大爷的字符串题
二次联通门 : luogu P3709 大爷的字符串题 /* luogu P3709 大爷的字符串题 莫队 看了半天题目 + 题解 才弄懂了要求什么... 维护两个数组 一个记录数字i出现了几次 一个 ...
- 洛谷P3709 大爷的字符串题(莫队)
题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区 ...
- 【Luogu】P3709大爷的字符串题(莫队算法)
题目链接 语文题啊…… 看题解发现是让求区间中最多的数的个数,于是果断理解了一会题解……莫队套上完事. sum[i]表示i这个数出现的次数,cnt[i]表示出现i次的数有几个,然后乱搞搞……就好了 # ...
- 洛谷 P3709 大爷的字符串题
https://www.luogu.org/problem/show?pid=3709 题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个 ...
- P3709 大爷的字符串题(50分)
题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区 ...
- P3709 大爷的字符串题
题意 询问区间众数出现的次数 思路 唯有水题快人心 离散化+莫队 莫队一定要先加后减,有事会出错的 莫队维护区间众数: 维护两个数组,一个数组记录权值为x的出现次数,一个记录出现次数为x的数的个数 a ...
- 【题解】洛谷P3709大爷的字符串题
最近想要练习一下莫队(实在是掌握的太不熟练了啊.)这题一开始看到有点懵(题面杀),后来发现是要求众数的个数.乍一看好像很难的样子. 但仔细分析一下:首先往序列当中加入一个数,这个是很简单的,只需要维护 ...
- 并不对劲的p3709:大爷的字符串题
题目大意 区间众数 题解 莫队 代码 #include<algorithm> #include<cmath> #include<cstdio> #include&l ...
随机推荐
- [转]AI+RPA 融合更智能
本文转自:https://www.jianshu.com/p/cf25b3dfc0f0 前面已经分析过多次RPA的本质,可以参考 [脱下外衣],看看RPA机器人到底是什么? 哪些AI相关应用技 ...
- ConcurrentHashMap1.8源码分析
文章简介 想必大家对HashMap数据结构并不陌生,JDK1.7采用的是数组+链表的方式,JDK1.8采用的是数组+链表+红黑树的方式.虽然JDK1.8对于HashMap有了很大的改进,提高了存取效率 ...
- Ubuntu16.04安装RealSense SR300驱动
原文链接 https://blog.csdn.net/u013401766/article/details/78472285 第一步:CMake 3.14.0 安装 1)下载cmake-3.14.1. ...
- su和sudo的区别
首先来说一下su 然后是sudo
- Salesforce的对象和字段
对象 Salesforce默认提供了很多功能,可以用于销售.市场开发.客服等.为了实现这些功能,Salesforce提供了一系列的标准对象,比如"客户"(Account).&quo ...
- ElasticSearch-6.3.2 linux 安装
在linux 系统安装ElasticSearch-6.3.2最新版本,也适合6.x 系列版本做参考 前提先在linux 安装好jdk1.8 创建用户 从5.0开始,ElasticSearch 安全级别 ...
- “等一下,我碰!”——常见的2D碰撞检测
转自:https://aotu.io/notes/2017/02/16/2d-collision-detection/ 在 2D 环境下,常见的碰撞检测方法如下: 外接图形判别法 轴对称包围盒(Axi ...
- WordCount结对编程
合作者:201631062602,201631062114 代码地址:https://gitee.com/Changyu-Guo/pairing_project 作业链接:https://www.cn ...
- 太嚣张了!他竟用Python绕过了“验证码”
在web页面中,经常会遇到验证码,这对于我这么一个热爱web自动化测试人员,就变成了一件头疼的事.于是千方百计找各种资源得到破解简单的验证码方法. 识别验证码 大致分如下几个步骤: 1.获取验证码图片 ...
- WinForm 双向数据绑定
程序目标: 控件的属性值与对象的属性值双向绑定使窗口控件的属性值与对象的属性值保持一致.对窗口控件属性值更改后立即更新对象的属性值,对对象的属性值更改后立即更新窗口控件的属性值. 程序完整代码包:ht ...