最近想要练习一下莫队(实在是掌握的太不熟练了啊。)这题一开始看到有点懵(题面杀),后来发现是要求众数的个数。乍一看好像很难的样子。

  但仔细分析一下:首先往序列当中加入一个数,这个是很简单的,只需要维护一个 \(cnt[k]\) 表示 \(k\) 数字出现的次数,看看是否超过了当前维护的最大值即可。难在如何从区间中删除一个数:要注意到莫队所具有的一个独特性质即每一次的转移只在相邻的两格之间发生。这就大大的简化了问题:分成两个部分来考虑,即1.当前删去的数是众数 / 2. 当前删去的数不是众数。我们再维护一个数组 \(num[k]\) 表示在当前区间中出现了 \(k\) 次的数一共有多少个。如果删去的是众数,则查看一下是否还有别的众数,否则答案-1;不是众数,更新一下两个数组即可。

#include <bits/stdc++.h>
using namespace std;
#define maxn 400000
int n, m, k, B = , tot;
int Ans[maxn], cnt[maxn], ans;
int b[maxn], a[maxn], num[maxn];
map <int, int> Map; struct node
{
int l, r, id, bel;
node(int ll = , int rr = , int idx = ) { l = ll, r = rr, id = idx; bel = ll / B + ; }
friend bool operator <(const node& a, const node& b)
{
if(a.bel != b.bel) return a.bel < b.bel;
else return a.r < b.r;
}
}Q[maxn]; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void Minus(int k)
{
if(ans == cnt[a[k]])
if(num[cnt[a[k]]] == ) ans = cnt[a[k]] - ;
num[cnt[a[k]]] --, num[-- cnt[a[k]]] ++;
} void Add(int k)
{
if(ans == cnt[a[k]]) ans = cnt[a[k]] + ;
if(cnt[a[k]] + > ans) ans = cnt[a[k]] + ;
num[cnt[a[k]]] --, num[++ cnt[a[k]]] ++;
} signed main()
{
n = read(), m = read(); B = sqrt(n);
for(int i = ; i <= n; i ++) b[i] = a[i] = read();
sort(b + , b + + n);
for(int i = ; i <= n; i ++)
if(b[i] != b[i - ] || i == ) Map[b[i]] = ++ tot;
for(int i = ; i <= n; i ++)
a[i] = Map[a[i]];
for(int i = ; i <= m; i ++)
{
int l = read(), r = read();
Q[i] = node(l, r, i);
}
sort(Q + , Q + + m);
int ll = , rr = ; ans = , cnt[a[]] = , num[] = ;
for(int i = ; i <= m; i ++)
{
if(Q[i].l <= rr)
{
while(ll < Q[i].l) Minus(ll), ll ++;
while(ll > Q[i].l) ll --, Add(ll);
while(rr > Q[i].r) Minus(rr), rr --;
while(rr < Q[i].r) rr ++, Add(rr);
}
else
{
while(rr > Q[i].r) Minus(rr), rr --;
while(rr < Q[i].r) rr ++, Add(rr);
while(ll < Q[i].l) Minus(ll), ll ++;
while(ll > Q[i].l) ll --, Add(ll);
}
Ans[Q[i].id] = ans;
}
for(int i = ; i <= m; i ++) printf("-%d\n", Ans[i]);
return ;
}

【题解】洛谷P3709大爷的字符串题的更多相关文章

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

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

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

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

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

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

  4. 洛谷P3709 大爷的字符串

    题意:多次求区间众数的出现次数. 解: 这题居然可以莫队...... 首先开个桶.然后还要开个数组,cnt[i]表示出现i次的数有多少个. 然后就可以O(1)修改了. #include <cst ...

  5. luogu P3709 大爷的字符串题

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

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

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

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

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

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

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

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

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

随机推荐

  1. NB-IOT连接基站需要的步骤

    本次使用华为海思Hi2110芯片,657SP3版本软件,利尔达的NB-IOT模块,串口波特率9600,基本需要5个AT指令. 1.上电之后设置IEMI号码,见模组上面的标签.AT+NTSETID=1, ...

  2. iOS应用App Store发布流程

    iOS应用App Store发布流程 要发布iOS应用到App Store首先得有一个开发者账号,且不能是企业版(企业版只能部署inhouse,不能部署到App Store). 应用发布到App St ...

  3. ORA-15032、ORA-15033—Linux环境

    SQL> alter diskgroup DATA add failgroup DATA_0000 disk '/dev/raw/raw12'; alter diskgroup DATA add ...

  4. Pycharm中查看方法的源码

    方法1.鼠标放在函数上,Ctrl+B,看源码 方法2.将光标移动至要查看的方法处,按住ctrl 键,点击鼠标左键,即可查看该方法的源码.

  5. Spring Cloud(七):配置中心(Git 版与动态刷新)【Finchley 版】

    Spring Cloud(七):配置中心(Git 版与动态刷新)[Finchley 版]  发表于 2018-04-19 |  更新于 2018-04-24 |  Spring Cloud Confi ...

  6. JDK源码分析:Short.java

    Short是基本数据类型short的包装类. 1)声明部: public final class Short extends Number implements Comparable<Short ...

  7. CVPR2018 关于视频目标跟踪(Object Tracking)的论文简要分析与总结

    本文转自:https://blog.csdn.net/weixin_40645129/article/details/81173088 CVPR2018已公布关于视频目标跟踪的论文简要分析与总结 一, ...

  8. kaldi - Online Audio Server(服务器客户端建立方法-旧版在线解码)

    目录 一.服务器客户端识别系统建立方法 1. Command line to start the server(服务器端启动方式): 2. Command line to start the clie ...

  9. C语言链接数据库

    一.解释一下函数功能和用法 1.mysql_real_connect 函数原型:MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, co ...

  10. Python3 Tkinter-Checkbutton

    1.多选按钮创建 from tkinter import * root=Tk() Checkbutton(root,text='python').pack() root.mainloop() 2.绑定 ...