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

  但仔细分析一下:首先往序列当中加入一个数,这个是很简单的,只需要维护一个 \(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. Emmet 技巧

    1. Lorem 产生一段 dummy text 2. $ 变量的使用 3. 插入img的长度和宽度 使用快捷键ctrl+u插入图片的长度和宽度 注意光标要停留在图片文件名上. 其他在Sublime中 ...

  2. Linux 下获取通讯IP

    #!/bin/sh # filename: get_net.sh default_route=$(ip route show) default_interface=$() address=$(ip a ...

  3. android学习七 菜单

    1.菜单分类 常规菜单 子菜单 上下文菜单 图标菜单 辅助菜单 交替菜单 2.菜单类 andriod.view.menu   3.菜单的参数     名称:字符串标题     菜单ID:整数     ...

  4. 机器学习介绍(introduction)-读书笔记-

    一,什么是机器学习 第一个机器学习的定义来自于 Arthur Samuel.他定义机器学习为,在进行特定编程的情况下,给予计算机学习能力的领域.Samuel 的定义可以回溯到 50 年代,他编写了一个 ...

  5. halcon安装提示could not write updated path to HKLM

    halcon安装提示could not write updated path to HKLM 我们在安装Halcon软件时,会弹出如上图错误信息,这个错误信息提示软件无法写入本地注册表,造成这个原因有 ...

  6. tendermint学习

    怎么把两个节点变成验证节点 1. 两个节点分别启动 2. 两个节点同时把自己的公钥信息添加到对方的创始快配置文件中,总而言之,创始块一样 3. unsafe_reset_priv_validator ...

  7. 官方文档 恢复备份指南三 Recovery Manager Architecture

    本节讨论以下问题: About the RMAN Environment                        关于RMAN环境 RMAN Command-Line Client        ...

  8. 关于docker 基础使用记录

    Docker Hub地址:https://hub.docker.com Docker Hub 存放着 Docker 及其组件的所有资源.Docker Hub 可以帮助你与同事之间协作,并获得功能完整的 ...

  9. php分页类的实现与调用 (自我摘记)

    page.class.php <?php namespace Component; class Page { private $total; //数据表中总记录数 private $listRo ...

  10. xml解析----java中4中xml解析方法(转载)

    转载:https://www.cnblogs.com/longqingyang/p/5577937.html 描述 XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与 ...