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. Redis使用过程中有哪些注意事项?看看BAT这类的公司是正确使用Redis的!!

    Redis使用过程中要注意的事项 Redis使用起来很简单,但是在实际应用过程中,一定会碰到一些比较麻烦的问题,常见的问题有 redis和数据库数据的一致性 缓存雪崩 缓存穿透 热点数据发现 下面逐一 ...

  2. 全场景效能平台猪齿鱼常用的前端css实现方案

    ​ 居中 最常用的height + line-height,以及margin:0 auto的居中方式就不再阐述,以下介绍两种容错性高的实现方案. flex布局实现 ​ 猪齿鱼前端日常开发中,我们多以f ...

  3. gridlayout在kv中的引用

    from kivy.app import App from kivy.uix.gridlayout import GridLayout class GridLayoutWidget(GridLayou ...

  4. seata整合nacos完成分布式的部署

    seata整合nacos完成分布式的部署 一.背景 二.部署机器 三.部署步骤 1.在seata上创建命名空间 2.下载对应版本的seata 3.单机启动 1.修改seata配置文件 1.修改注册中心 ...

  5. 2021.8.8考试总结[NOIP模拟33]

    T1 Hunter 考场上一看期望直接状压拿了$45pts$跑了.结果正解只用$4$行? 把问题转化为一号猎人之前死的猎人数的期望加一. 期望的线性性. 对每个猎人$i$,$w_i+w_1$种情况中有 ...

  6. Windows平台编译器相关的几个预定义宏

    WIN32 是在windows.h 中定义的宏,包含winodws.h则定义该宏 _WIN32/_WIN64跟windows平台有关的宏,_WIN32在windows   32位和64位下都有该宏,_ ...

  7. 如何用PADS进行PCB设计?这6步就够了

    在使用PADS进行PCB设计的过程中,需要对印制板的设计流程以及相关的注意事项进行重点关注,这样才能更好的为工作组中的设计人员提供系统的设计规范,同时也方便设计人员之间进行相互的交流和检查. 02 设 ...

  8. 顺时针打印矩阵 牛客网 剑指Offer

    顺时针打印矩阵 牛客网 剑指Offer 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 ...

  9. hdu 1198 Farm Irrigation(并查集)

    题意: Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a ...

  10. oracle 账号解锁 java.sql.SQLException: ORA-28000: the account is locked

    日志报错:ORA-28000: the account is locked 1.plsql登录提示用户被锁定 2.sys登录sqlplus登录查看 SQL> select username,ac ...