P9461
昨天比赛由于时间原因只看了一眼,这个题感觉挺有意思,随便写了个暴力,结果拿到了 0pts 的高分就没再看……赛后发现有一种情况的性质想错了……
以上都是废话
题意简述
给出序列 $\{a_1,a_2,\cdots,a_n\}(1\le n\le10^6,1\le a_i\le10^6)$,构造序列 $b=\{1,2,\cdots,a_1,1,2,\cdots,a_2,\cdots,1,2,\cdots,a_n\}$。求 $b$ 的所有子区间最小众数之和。
题目分析
最基础的暴力很好做,直接构造 $b$ 进行统计就行。
注意到 $a_i$ 并不太大(当然大了离散化后也一样),那么 $b$ 不同区间的最小众数也不会有太多情况。我们自然想到可以统计每个数作为区间最小众数的情况数之和。比赛时我也是想到了类似于出题人大佬的区间最小众数性质:要么是 $1$,要么是区间的左端点。具体的证明我没有特意去写,大家可以直接看出题人大佬的题解,里面说的很详细。
那么对于每个 $b$ 中的区间内的元素,可以拆成 $[l,a_x],[1,a_{x+1}],[1,a_{x+2}],\cdots,[1,a_{y-1}],[1,r]$。当且仅当 $\forall i\in[x,y-1],a_i\ge l$ 且 $r\ge l$ 时区间最小众数为 $l$,否则为 $1$(比赛时我误认为只要 $r\ge l$ 就行,导致了爆零)。
证明比较简单:
若 $\forall i\in[x,y-1],a_i\ge l$ 且 $r\ge l$,则 $l$ 在所有区间都存在,出现了 $y-x+1$ 次;而 $1,2,\cdots,l-1$ 在第一个区间不存在,至多出现 $y-x$ 次,不可能为众数;$l+1,l+2,\cdots$ 也至多出现 $y-x+1$ 次,即使是众数也不可能是最小众数。因此最小众数必为 $l$。
否则,$\exists i\in[x,y-1],a_i<l$ 或 $r<l$,那么 $l,l+1,l+2,\cdots$ 在 $[1,a_i]$ 或 $[1,r]$ 必然不出现,至多出现 $y-x$ 次;$1$ 只在第一个区间不出现,必然出现 $y-x$ 次,$2,3,\cdots,l-1$ 则至多出现 $y-x$ 次。由此判断 $1$ 必为最小众数。
那么有了以上的结论,我们就可以很简单地统计了。对于每个 $l$,用链表快速统计出 $\ge l$ 的极大连续段进行计算即可。