题意:多次求区间众数的出现次数。

解:

这题居然可以莫队......

首先开个桶。然后还要开个数组,cnt[i]表示出现i次的数有多少个。

然后就可以O(1)修改了。

 #include <cstdio>
#include <algorithm>
#include <cmath> inline void read(int &x) {
x = ;
char c = getchar();
while(c < '' || c > '') {
c = getchar();
}
while(c >= '' && c <= '') {
x = (x << ) + (x << ) + c - ;
c = getchar();
}
return;
} const int N = ; int fr[N], a[N], bin[N], cnt[N], ans, X[N]; struct ASK {
int l, r, t, ans;
inline bool operator <(const ASK &w) const {
if(fr[l] != fr[w.l]) {
return fr[l] < fr[w.l];
}
return r < w.r;
}
}ask[N]; inline bool cmp(const ASK &A, const ASK &B) {
return A.t < B.t;
} inline void add(int p) {
cnt[bin[a[p]]]--;
bin[a[p]]++;
cnt[bin[a[p]]]++;
if(bin[a[p]] > ans) {
ans = bin[a[p]];
}
return;
} inline void del(int p) {
cnt[bin[a[p]]]--;
bin[a[p]]--;
cnt[bin[a[p]]]++;
if(!cnt[bin[a[p]] + ] && ans == bin[a[p]] + ) {
ans--;
}
return;
} int main() {
int n, m;
read(n);
read(m);
int T = sqrt(n);
for(int i = ; i <= n; i++) {
read(a[i]);
X[i] = a[i];
fr[i] = (i - ) / T + ;
}
for(int i = ; i <= n; i++) {
read(ask[i].l);
read(ask[i].r);
ask[i].t = i;
}
std::sort(X + , X + n + );
std::sort(ask + , ask + m + );
int temp = std::unique(X + , X + n + ) - X - ;
for(int i = ; i <= n; i++) {
a[i] = std::lower_bound(X + , X + temp + , a[i]) - X;
} int l = , r = ;
ans = ;
bin[a[]]++;
cnt[] = ;
for(int i = ; i <= m; i++) {
while(l > ask[i].l) {
add(--l);
}
while(r < ask[i].r) {
add(++r);
}
while(l < ask[i].l) {
del(l++);
}
while(r > ask[i].r) {
del(r--);
}
ask[i].ans = ans;
} std::sort(ask + , ask + m + , cmp);
for(int i = ; i <= m; i++) {
printf("%d\n", -ask[i].ans);
}
return ;
}

AC代码

洛谷P3709 大爷的字符串的更多相关文章

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

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

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

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

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

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

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

    题目传送门 不用管它随机什么的,就用贪心的思想去想, 会发现这道题的实质是:求查询区间众数出现次数. 莫队即可解决. 注意字符集1e9,要离散化处理. #include <bits/stdc++ ...

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

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

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

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

  7. luogu P3709 大爷的字符串题

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

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

    看这题网上居然还没人写blog,怕是都去看洛谷自带的了-- 你才是字符串!你全家都是字符串!这题跟字符串没多大关系,只是出题人lxl想要吐槽某中学而已--... 其实这题说白了就是问区间里出现最多的数 ...

  9. AC日记——大爷的字符串题 洛谷 P3709

    大爷的字符串题 思路: 莫队,需开O2,不开50: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 20000 ...

随机推荐

  1. python 获取列表中次大的数值.

    需求: 1.写个函数,把一组数字传到函数中,然后取出最大值和次大值. 2.不能使用排序函数. 分析: Q: list = [100,50,60,70,30,45] 怎么从这个列表中取出最大值? A: ...

  2. Django项目目录介绍

    一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model(模型):和数据库相关的,负 ...

  3. prometheus和metrucs-server (k8s监控)

    资源指标:metrucs-server 自定义指标:prometheus, k8s-prometheus-adapter(转换prometheus数据的格式) 新一代架构: 核心指标流水线:由kube ...

  4. MySQL 索引长度和区分度

    首先  索引长度和区分度是相互矛盾的, 索引长度太短,那么区分度就很低,吧索引长度加长,区分度就高,但是索引也是要占内存的,所以我们需要找到一个平衡点: 那么这个平衡点怎么来定? 比如用户表有个字段 ...

  5. 安装 BizTalk Server 2016

    在单台计算机上安装 BizTalk Server. 开始操作之前       系统管理员 – 安装 SQL Server 时,安装程序会自动向登录的帐户授予系统管理员权限. 由于安装 BizTalk ...

  6. Nginx map模块

    L77 Syntax: map string $variable { ... } Default: — Context: http map 指令 curl -H 'aaaa:4444444' -H ' ...

  7. JarvisOJ Basic 爱吃培根的出题人

    听说你也喜欢吃培根?那我们一起来欣赏一段培根的介绍吧: bacoN is one of aMerICa'S sWEethEartS. it's A dARlinG, SuCCulEnt fOoD tH ...

  8. 洛谷 P1112 波浪数

    题目描述 波浪数是在一对数字之间交替转换的数,如 121212112121211212121 ,双重波浪数则是指在两种进制下都是波浪数的数,如十进制数 191919191919191919 是一个十进 ...

  9. kubernetes 每个node上只能运行一个副本DaemonSet

    每个node上只能运行一个副本: apiVersion: extensions/v1beta1 kind: DaemonSet #使用DaemonSet的方式运行 metadata: name: ku ...

  10. Git——取消merge状态

    MERGING状态 取消MERGING 查看更新历史 $ git reflog 恢复之前状态 $ git reset --hard 06a5578