Codeforces 1446D2 - Frequency Problem (Hard Version)(根分)
人菜结论题做不动/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)(根分)的更多相关文章
- 题解 CF1446D2 【Frequency Problem (Hard Version)】
给出一个跑得快一点的做法,洛谷最优解 (时间是第二名的 \(\frac{1}{2}\)), CF 第一页 D1 首先找到整个序列的众数 \(G\), 很容易证明答案序列中的两个众数中其中一个是 \(G ...
- Codeforces 1406E - Deleting Numbers(根分+数论)
Codeforces 题面传送门 & 洛谷题面传送门 一道个人感觉挺有意思的交互题,本人一开始想了个奇奇怪怪的做法,还以为卡不进去,结果发现竟然过了,而且还是正解( 首先看到这类题目可以考虑每 ...
- PTA 11-散列4 Hard Version (30分)
题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/680 5-18 Hashing - Hard Version (30分) Given ...
- codeforces 340C Tourist Problem
link:http://codeforces.com/problemset/problem/340/C 开始一点也没思路,赛后看别人写的代码那么短,可是不知道怎么推出来的啊! 后来明白了. 首先考虑第 ...
- codeforces B. Routine Problem 解题报告
题目链接:http://codeforces.com/problemset/problem/337/B 看到这个题目,觉得特别有意思,因为有熟悉的图片(看过的一部电影).接着让我很意外的是,在纸上比划 ...
- 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 ...
- Codeforces 527D Clique Problem
http://codeforces.com/problemset/problem/527/D 题意:给出一些点的xi和wi,当|xi−xj|≥wi+wj的时候,两点间存在一条边,找出一个最大的集合,集 ...
- Codeforces 706C - Hard problem - [DP]
题目链接:https://codeforces.com/problemset/problem/706/C 题意: 给出 $n$ 个字符串,对于第 $i$ 个字符串,你可以选择花费 $c_i$ 来将它整 ...
- Codeforces 1096D - Easy Problem - [DP]
题目链接:http://codeforces.com/problemset/problem/1096/D 题意: 给出一个小写字母组成的字符串,如果该字符串的某个子序列为 $hard$,就代表这个字符 ...
随机推荐
- Redis使用过程中有哪些注意事项?看看BAT这类的公司是正确使用Redis的!!
Redis使用过程中要注意的事项 Redis使用起来很简单,但是在实际应用过程中,一定会碰到一些比较麻烦的问题,常见的问题有 redis和数据库数据的一致性 缓存雪崩 缓存穿透 热点数据发现 下面逐一 ...
- 全场景效能平台猪齿鱼常用的前端css实现方案
居中 最常用的height + line-height,以及margin:0 auto的居中方式就不再阐述,以下介绍两种容错性高的实现方案. flex布局实现 猪齿鱼前端日常开发中,我们多以f ...
- gridlayout在kv中的引用
from kivy.app import App from kivy.uix.gridlayout import GridLayout class GridLayoutWidget(GridLayou ...
- seata整合nacos完成分布式的部署
seata整合nacos完成分布式的部署 一.背景 二.部署机器 三.部署步骤 1.在seata上创建命名空间 2.下载对应版本的seata 3.单机启动 1.修改seata配置文件 1.修改注册中心 ...
- 2021.8.8考试总结[NOIP模拟33]
T1 Hunter 考场上一看期望直接状压拿了$45pts$跑了.结果正解只用$4$行? 把问题转化为一号猎人之前死的猎人数的期望加一. 期望的线性性. 对每个猎人$i$,$w_i+w_1$种情况中有 ...
- Windows平台编译器相关的几个预定义宏
WIN32 是在windows.h 中定义的宏,包含winodws.h则定义该宏 _WIN32/_WIN64跟windows平台有关的宏,_WIN32在windows 32位和64位下都有该宏,_ ...
- 如何用PADS进行PCB设计?这6步就够了
在使用PADS进行PCB设计的过程中,需要对印制板的设计流程以及相关的注意事项进行重点关注,这样才能更好的为工作组中的设计人员提供系统的设计规范,同时也方便设计人员之间进行相互的交流和检查. 02 设 ...
- 顺时针打印矩阵 牛客网 剑指Offer
顺时针打印矩阵 牛客网 剑指Offer 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 ...
- hdu 1198 Farm Irrigation(并查集)
题意: Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a ...
- 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 ...