Codeforces 题面传送门 & 洛谷题面传送门

人菜结论题做不动/kk

首先考虑此题一个非常关键的结论:我们设整个数列的众数为 \(G\),那么在最优子段中,\(G\) 一定是该子段的众数之一。考虑反证法,如果最优子段中众数出现次数 \(<\) 该子段中出现次数最多的数的出现次数,那么我们考虑向左向右扩展这个区间,显然由于 \(G\) 是整个区间中出现次数最多的数,我们总可以找到一个时刻,满足 \(G\) 的出现次数 \(\ge\) 原子段中出现次数最多的数的出现次数,此时子段的长度肯定不劣于原子段的长度,答案也不会变得更差。

看出这个性质之后 D1 就变得异常 trivial 了,考虑枚举除了 \(G\) 之外字段中另一个众数 \(x\),那么考虑一个非常常用的套路:将序列中 \(G\) 的权值看作 \(1\),\(x\) 的权值看作 \(-1\),那么一个子段满足条件,当且仅当该子段中所有数的权值之和恰好为 \(0\),拿个桶记录一下即可。

接下来考虑怎样解 D2。注意到这个东西长得像极了 P4062 Code+#1 Yazid 的新生舞会,而这东西用线段树显然是不太好维护的,因此考虑我的那个根分做法。考虑将所有数分为出现次数 \(\le\sqrt{n}\) 和 \(>\sqrt{n}\) 进行处理。出现次数 \(>\sqrt{n}\) 的数的个数显然是 \(\mathcal O(\sqrt{n})\) 级别的,我们对于这些数重复一遍 D1 的过程即可。对于出现次数 \(\le\sqrt{n}\) 的数我们换个角度批量处理这些数,即我们不关心出现次数最多的是哪个数,我们直接枚举众数的出现次数 \(c\),然后双针,对于每个左端点,向右一直扩展直到其中出现次数最多的数出现次数 \(>c\),如果我们发现出现次数最多的数不唯一则更新答案即可。这样复杂度就是 \(n\sqrt{n}\)。

const int MAXN=2e5;
const int DLT=MAXN+3;
int n,a[MAXN+5],cnt[MAXN+5],fst[DLT<<1],cnt_cnt[MAXN+5],res=0;
int main(){
scanf("%d",&n);int G=0,mxcnt=0,lim=(int)sqrt(n),mx=0;
for(int i=1;i<=n;i++) scanf("%d",&a[i]),cnt[a[i]]++;
for(int i=1;i<=n;i++) chkmax(mx,cnt[i]);
for(int i=1;i<=n;i++) if(cnt[i]==mx) mxcnt++,G=i;
if(mxcnt>=2) return printf("%d\n",n),0;
// printf("%d\n",G);
for(int i=1;i<=n;i++) if(cnt[i]>lim&&i!=G){
memset(fst,-1,sizeof(fst));fst[DLT]=0;
for(int j=1,s=0;j<=n;j++){
if(a[j]==G) s++;if(a[j]==i) s--;
if(~fst[s+DLT]) chkmax(res,j-fst[s+DLT]);
else fst[s+DLT]=j;
}
} //printf("%d\n",res);
for(int i=1;i<=lim+3;i++){
memset(cnt,0,sizeof(cnt));int mx=0;
memset(cnt_cnt,0,sizeof(cnt_cnt));
for(int l=1,r=1;l<=n;l++){
while(r<=n&&max(mx,cnt[a[r]]+1)<=i){
cnt_cnt[cnt[a[r]]]--;cnt[a[r]]++;cnt_cnt[cnt[a[r]]]++;
chkmax(mx,cnt[a[r]]);++r;
} //printf("%d %d %d\n",i,l,r);
if(cnt_cnt[mx]>=2) chkmax(res,r-l);
cnt_cnt[cnt[a[l]]]--;cnt[a[l]]--;cnt_cnt[cnt[a[l]]]++;
if(!cnt_cnt[mx]) mx--;
}
} printf("%d\n",res);
return 0;
}

Codeforces 1446D2 - Frequency Problem (Hard Version)(根分)的更多相关文章

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

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

  2. Codeforces 1406E - Deleting Numbers(根分+数论)

    Codeforces 题面传送门 & 洛谷题面传送门 一道个人感觉挺有意思的交互题,本人一开始想了个奇奇怪怪的做法,还以为卡不进去,结果发现竟然过了,而且还是正解( 首先看到这类题目可以考虑每 ...

  3. PTA 11-散列4 Hard Version (30分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/680 5-18 Hashing - Hard Version   (30分) Given ...

  4. codeforces 340C Tourist Problem

    link:http://codeforces.com/problemset/problem/340/C 开始一点也没思路,赛后看别人写的代码那么短,可是不知道怎么推出来的啊! 后来明白了. 首先考虑第 ...

  5. codeforces B. Routine Problem 解题报告

    题目链接:http://codeforces.com/problemset/problem/337/B 看到这个题目,觉得特别有意思,因为有熟悉的图片(看过的一部电影).接着让我很意外的是,在纸上比划 ...

  6. PTA 07-图5 Saving James Bond - Hard Version (30分)

    07-图5 Saving James Bond - Hard Version   (30分) This time let us consider the situation in the movie ...

  7. Codeforces 527D Clique Problem

    http://codeforces.com/problemset/problem/527/D 题意:给出一些点的xi和wi,当|xi−xj|≥wi+wj的时候,两点间存在一条边,找出一个最大的集合,集 ...

  8. Codeforces 706C - Hard problem - [DP]

    题目链接:https://codeforces.com/problemset/problem/706/C 题意: 给出 $n$ 个字符串,对于第 $i$ 个字符串,你可以选择花费 $c_i$ 来将它整 ...

  9. Codeforces 1096D - Easy Problem - [DP]

    题目链接:http://codeforces.com/problemset/problem/1096/D 题意: 给出一个小写字母组成的字符串,如果该字符串的某个子序列为 $hard$,就代表这个字符 ...

随机推荐

  1. 生产环境全链路压测平台 Takin

    什么是Takin? Takin是基于Java的开源系统,可以在无业务代码侵入的情况下,嵌入到各个应用程序节点,实现生产环境的全链路性能测试,适用于复杂的微服务架构系统. Takin核心原理图 Taki ...

  2. NOIP模拟83(多校16)

    前言 CSP之后第一次模拟赛,感觉考的一般. 不得不吐槽多校联测 OJ 上的评测机是真的慢... T1 树上的数 解题思路 感觉自己思维有些固化了,一看题目就感觉是线段树. 考完之后才想起来这玩意直接 ...

  3. 第02课 OpenGL 多边形

    你的第一个多边形: 在第一个教程的基础上,我们添加了一个三角形和一个四边形.也许你认为这很简单,但你已经迈出了一大步,要知道任何在OpenGL中绘制的模型都会被分解为这两种简单的图形.读完了这一课,你 ...

  4. 学会python永不加班系列之操作excel

    python作为一种解释性语言,简单高效的模式逐渐火爆.同时存在多种扩展性. 永不加班系列 python正确操作excel 实验环境: 系统:win10 语言:python3.8 承载软件:pycha ...

  5. native连接远程mysql数据库

    1.环境 CentOS7.mysqld 8.0.19 2.登录数据库 #mysql -u root -p 2.修改root登录地址为%(任何IP) mysql> update user set ...

  6. newusers 拷贝服务器A上的用户,批量添加到其它服务器

    服务器B 需要添加多个用户,要求与服务器A 的用户列表一致 1.拷贝服务器A 上的 /etc/passwd 中用户信息,用user1-10为例 #grep ^user /etc/passwd > ...

  7. kafka的安装

    kafka是基于java环境的,所以需要先安装java环境 centos:yum install java-11-openjdk ubuntu:apt install default-jdk 默安装默 ...

  8. 线程私有数据TSD——一键多值技术,线程同步中的互斥锁和条件变量

    一:线程私有数据: 线程是轻量级进程,进程在fork()之后,子进程不继承父进程的锁和警告,别的基本上都会继承,而vfork()与fork()不同的地方在于vfork()之后的进程会共享父进程的地址空 ...

  9. 【Java】 List和Array转换

    List转Array toArray 首先展示初学者容易犯的错误示例 List<String> strList = new ArrayList<>(); strList.add ...

  10. [linux]centos7.4上升级python2版本到python3.6.5 【安装双版本,默认python3】

    版本声明 centos7.4 前言:linux上的python默认是版本2的,之前学django项目用的是3的版本 所以得升级下版本~ 1.下载python3.6.5 cd /usr/local/ w ...