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$,就代表这个字符 ...
随机推荐
- SharkCTF2021 pwn“初见”1
(无内鬼 今日不想学了 水一篇) nc nc nc easyoverflow Intoverflow
- Redis:学习笔记-03
Redis:学习笔记-03 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 7. Redis配置文件 启动 ...
- [no code][scrum meeting] Alpha 9
项目 内容 会议时间 2020-04-15 会议主题 OCR验收 会议时长 15min 参会人员 OCR组成员 $( "#cnblogs_post_body" ).catalog( ...
- 认识spring security
在一个系统中认证和授权是常有的事情,现在比较流行的框架有spring security.shiro等等.他们都能很好的帮助我们完成认证和授权的功能.那么假如说让我们自己完成一个登录那么应该大致的流程是 ...
- 2021.8.8考试总结[NOIP模拟33]
T1 Hunter 考场上一看期望直接状压拿了$45pts$跑了.结果正解只用$4$行? 把问题转化为一号猎人之前死的猎人数的期望加一. 期望的线性性. 对每个猎人$i$,$w_i+w_1$种情况中有 ...
- 文件上传漏洞Bypass总结
文件上传漏洞Bypass总结 前端JS验证文件类型: 上传后缀jpg,抓包改为php后缀 ======================================================= ...
- 空格替换 牛客网 程序员面试金典 C++ Python
空格替换 牛客网 程序员面试金典 C++ Python 题目描述 请编写一个方法,将字符串中的空格全部替换为"%20".假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实 ...
- 重学STM32---(十)之CAN通信(二)
目录 前言 程序编写 主代码 测试 前言 CAN协议是非常难的,但是在stm32中却是简单的,只需要我们配置寄存器即可,,,即使这样,我在学习的时候也遇到了许多困难 程序编写 1.开时钟,不用说 ...
- robot_framewok自动化测试--(6)Collections 库
Collections 库 Collections 库同样为 Robot Framework 标准类库,它所提供的关键字主要用于列表.索引.字典的处理. 在使用之前需要在测试套件(项目)中添加: 1. ...
- MySQL、Oracle批量插入SQL的通用写法
举个例子: 现在要批量新增User对象到数据库USER表中 public class User{ //姓名 private String name; //年龄 private Integer age; ...