题目

给定一个长度为 \(n\) 的序列,问是否存在一个最长的区间使得至少存在两个众数。


分析

实际上 Easy Version 是用来启发大于根号的做法的。

众数可以说有一个性质吧,答案区间中的其中一个众数一定是整个序列的众数。

当然如果整个序列有多个众数答案就是 \(n\),如果只有一种数答案就是 \(0\)。

只需要考虑一种众数的情况,先看 Easy Version(数字种类不超过一百)。

如果数字种类数足够少,直接枚举数字种类,那么相当于一段区间众数和该种数字出现次数相等。

那么将众数视为 \(-1\),该种数字视为 \(1\),即求是否存在一段区间和为零,那直接前缀和记录最早位置即可。

但是 Hard Version 的时候不能所有数字都算一遍,

考虑枚举出现次数 \(T\),然后用一个双指针求出对于每一个右端点 \(r\),求出最小的 \(l\) 使得 \([l,r]\) 数字出现次数不超过 \(T\)。

这样只要有至少两个数字出现次数为 \(T\),\([l,r]\) 就是一段符合要求的区间。

将两种方法结合一下,\(T\) 只枚举到根号,枚举数字种类只枚举出现次数超过根号的数字,这样就是 \(O(n\sqrt{n})\) 的


代码

#include <cstdio>
#include <cctype>
using namespace std;
const int N=200011,bl=400;
int n,mx,se,cnt[N],a[N],c[N],las[N<<1],ans;
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
int max(int a,int b){return a>b?a:b;}
int main(){
n=iut();
for (int i=1;i<=n;++i) ++cnt[a[i]=iut()];
for (int i=1;i<=n;++i)
if (cnt[i]>cnt[mx]) se=mx,mx=i;
else if (cnt[i]>cnt[se]) se=i;
if (!se) return !printf("0");
if (cnt[mx]==cnt[se]) return !printf("%d",n);
for (int T=1;T<=bl;++T){
int now=0;
for (int i=1,j=1;i<=n;++i){
for (;c[a[i]]==T;--c[a[j++]])
if (c[a[j]]==T) --now;
if (++c[a[i]]==T) ++now;
if (now>1) ans=max(ans,i-j+1);
}
for (int i=0;i<=n;++i) c[i]=0;
}
for (int i=1;i<=n;++i)
if (cnt[i]>bl&&i!=mx){
for (int j=0;j<=2*n;++j) las[j]=-1; las[n]=0;
for (int j=1,s=0;j<=n;++j){
if (a[j]==i) ++s;
else if (a[j]==mx) --s;
if (las[s+n]>=0) ans=max(ans,j-las[s+n]);
else las[s+n]=j;
}
}
return !printf("%d",ans);
}

#根号分治,前缀和,双指针#CF1446D2 Frequency Problem (Hard Version)的更多相关文章

  1. 题解 CF1446D2 【Frequency Problem (Hard Version)】

    给出一个跑得快一点的做法,洛谷最优解 (时间是第二名的 \(\frac{1}{2}\)), CF 第一页 D1 首先找到整个序列的众数 \(G\), 很容易证明答案序列中的两个众数中其中一个是 \(G ...

  2. Codeforces 1446D2 - Frequency Problem (Hard Version)(根分)

    Codeforces 题面传送门 & 洛谷题面传送门 人菜结论题做不动/kk 首先考虑此题一个非常关键的结论:我们设整个数列的众数为 \(G\),那么在最优子段中,\(G\) 一定是该子段的众 ...

  3. CF587F-Duff is Mad【AC自动机,根号分治】

    正题 题目链接:https://www.luogu.com.cn/problem/CF587F 题目大意 给出\(n\)个字符串\(s\).\(q\)次询问给出\(l,r,k\)要求输出\(s_{l. ...

  4. [CF587F]Duff is Mad[AC自动机+根号分治+分块]

    题意 给你 \(n\) 个串 \(s_{1\cdots n}\) ,每次询问给出 \(l,r,k\) ,问在 \(s_{l\cdots r}\) 中出现了多少次 \(s_k\) . \(n,q,\su ...

  5. CF1039D-You Are Given a Tree【根号分治,贪心】

    正题 题目链接:https://www.luogu.com.cn/problem/CF1039D 题目大意 给出\(n\)个点的一棵树,然后对于\(k\in[1,n]\)求每次使用一条长度为\(k\) ...

  6. UOJ#33-[UR #2]树上GCD【长链剖分,根号分治】

    正题 题目链接:https://uoj.ac/problem/33 题目大意 给出\(n\)个点的一棵树 定义\(f(x,y)=gcd(\ dis(x,lca),dis(y,lca)\ )\). 对于 ...

  7. NOI.AC#2266-Bacteria【根号分治,倍增】

    正题 题目链接:http://noi.ac/problem/2266 题目大意 给出\(n\)个点的一棵树,有一些边上有中转站(边长度为\(2\),中间有一个中转站),否则就是边长为\(1\). \( ...

  8. Codeforces 1039D You Are Given a Tree [根号分治,整体二分,贪心]

    洛谷 Codeforces 根号分治真是妙啊. 思路 考虑对于单独的一个\(k\)如何计算答案. 与"赛道修建"非常相似,但那题要求边,这题要求点,所以更加简单. 在每一个点贪心地 ...

  9. BZOJ.4320.[ShangHai2006]Homework(根号分治 分块)

    BZOJ \(\mathbb{mod}\)一个数\(y\)的最小值,可以考虑枚举剩余系,也就是枚举区间\([0,y),[y,2y),[2y,3y)...\)中的最小值(求后缀最小值也一样)更新答案,复 ...

  10. CF1039E Summer Oenothera Exhibition 贪心、根号分治、倍增、ST表

    传送门 感谢这一篇博客的指导(Orzwxh) $PS$:默认数组下标为$1$到$N$ 首先很明显的贪心:每一次都选择尽可能长的区间 不妨设$d_i$表示在取当前$K$的情况下,左端点为$i$的所有满足 ...

随机推荐

  1. Redis搭建Sentinel实验环境

    环境准备 在物理机上启动3台虚拟机,IP地址分别为:192.168.56.4,192.168.56.5,192.168.56.6. 1.确保3台虚拟机的网络是相互联通的. 2.确保已经在3台虚拟机上安 ...

  2. Flutter学习(一)——创建一个项目

    本文基于 flutter 2.5.1,开发工具 Visual Studio Code. 一.创建 打开 VS Code 点击 View > Command Palette-(快捷键command ...

  3. 【Azure Function】修改Function执行的Timeout时间

    问题描述 Azure Function默认的Timeout时间是否可以调整呢? 问题解答 可以的,根据创建Function的时候选择的定价层不同,Function 默认的Timeout时间也不同. 消 ...

  4. 【Azure Spring Cloud】在Azure Spring Apps上看见 App Memory Usage 和 jvm.menory.use 的指标的疑问及OOM

    问题描述 在Azure的Spring Cloud服务 (官名为:Spring Apps)中,在Metrics 页面中查看 App Memory Usage 和 jvm.memory.use,发现两则在 ...

  5. Nebula Graph 特性讲解——RocksDB 统计信息的收集和展示

    由于 Nebula Graph 的底层存储使用了 RocksDB,出于运维管理需要,我们的社区用户 @chenxu14 在 pr#2243 为 Nebula Graph 贡献了 RocksDB 统计信 ...

  6. PHP项目&TP框架&SQL&XSS&架构&路由&调试&写法

    开发基础-TP框架-入口&调试&路由&写法等 参考手册-TP5开发手册-为了掌握了解框架 首页文件看APP_PATH定义-为了后期分析核心代码 全局搜索:THINK_VERSI ...

  7. Educational Codeforces Round 143 (Rated for Div. 2)C. Tea Tasting(前缀和+二分、贡献枚举)

    C. Tea Tasting 思路 这里枚举有三种思路 然后经过考虑3是最可行的,然后接着考虑如何计算贡献 这里在实现的时候用了一个差分数组,因为我们需要记录第i个茶师它喝了多少个\(b_i\)以及不 ...

  8. select 条件语句【GO 基础】

    〇.select 简介 select 语句类似于 switch 语句,但是 select 会随机执行一个可运行的 case.如果没有 case 可运行,它将阻塞,直到有 case 可运行. selec ...

  9. Java面试必考题之线程的生命周期,结合源码,透彻讲解!

    写在开头 在前面的几篇博客里,我们学习了Java的多线程,包括线程的作用.创建方式.重要性等,那么今天我们就要正式踏入线程,去学习更加深层次的知识点了. 第一个需要学的就是线程的生命周期,也可以将之理 ...

  10. 开源好用的所见即所得(WYSIWYG)编辑器:Editor.js

    @ 目录 特点 基于区块 干净的数据 界面与交互 插件 标题和文本 图片 列表 Todo 表格 使用 安装 创建编辑器实例 配置工具 本地化 自定义样式 今天介绍一个开源好用的Web所见即所得(WYS ...