P9461

昨天比赛由于时间原因只看了一眼,这个题感觉挺有意思,随便写了个暴力,结果拿到了 0pts 的高分就没再看……赛后发现有一种情况的性质想错了……

以上都是废话

题意简述

给出序列 {a1,a2,,an}(1n106,1ai106),构造序列 b={1,2,,a1,1,2,,a2,,1,2,,an}。求 b 的所有子区间最小众数之和。

题目分析

最基础的暴力很好做,直接构造 b 进行统计就行。

注意到 ai 并不太大(当然大了离散化后也一样),那么 b 不同区间的最小众数也不会有太多情况。我们自然想到可以统计每个数作为区间最小众数的情况数之和。比赛时我也是想到了类似于出题人大佬的区间最小众数性质:要么是 1,要么是区间的左端点。具体的证明我没有特意去写,大家可以直接看出题人大佬的题解,里面说的很详细。

那么对于每个 b 中的区间内的元素,可以拆成 [l,ax],[1,ax+1],[1,ax+2],,[1,ay1],[1,r]。当且仅当 i[x,y1],ailrl 时区间最小众数为 l,否则为 1(比赛时我误认为只要 rl 就行,导致了爆零)。

证明比较简单:

i[x,y1],ailrl,则 l 在所有区间存在,出现了 yx+1 次;而 1,2,,l1 在第一个区间不存在,至多出现 yx 次,不可能为众数;l+1,l+2,至多出现 yx+1 次,即使是众数也不可能是最小众数。因此最小众数必为 l

否则,i[x,y1],ai<lr<l,那么 l,l+1,l+2,[1,ai][1,r] 必然不出现,至多出现 yx 次;1 只在第一个区间不出现,必然出现 yx 次,2,3,,l1至多出现 yx 次。由此判断 1 必为最小众数。

那么有了以上的结论,我们就可以很简单地统计了。对于每个 l,用链表快速统计出 l 的极大连续段进行计算即可。

posted @   Hadtsti  阅读(6)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示