模拟46 题解
A. Set
原序列中,一定存在一段连续的区间,保证区间和整除n。
不妨将区间和表示为前缀和的形式,
如果存在任意两个相同的取值,那么该区间合法。
而前缀和总共有n+1个,不同的取值最多有n个,固一定存在至少一个合法区间。
B. Read
题意其实是问序列中是否存在大于$\frac{n+1}{2}$的众数。
如果存在,那么求出这个众数出现了多少次。
然而数组根本开不下,没有办法使用常规扫一遍的求众数方法。
尝试利用一下题中的特殊性质:只需要考虑这个众数大于$\frac{n+1}{2}$的情况。
只要在扫一遍序列的过程中,不断维护当前的数,当前数的个数就可以了。
分别计为id,cnt。
如果cnt=0,将id设为该数,cnt=1
如果该数等于id,cnt++
如果该数不等于id,cnt--
扫一遍之后求出id,再扫一遍,统计有多少个数等于id就可以了。
C. Race
暴力dp是在trie树上求出每个选手在每个排名上的方案数,dp转移很显然。
然而这个dp的状态数已经达到了至少$n^2m$级别,
最后统计答案也要$n^2$级别,根本不可能通过$n=200000$。
正解是拆开题中给出的式子:
排名为x的选手,得分为$x^2$,
实际含义是:能力大于他的每个有序选手对(两者可以相同),会作出贡献1。
所以只要在trie树上统计:
对于每一个选手,m-1至i+1位相同,第i位开始不同的选手个数,设为$f[i]$。
枚举开始不同的两个位置,使这些选手的权值都大于本选手,
$ans=\sum \limits_{i=0}^{m-1} \sum \limits_{j=0}^{m-1}f[i]*f[j]*2^{i==j?m-1:m-2}$
显然当$[位置1=位置2]$转移的系数为$2^{m-1}$,表示二进制的该位置受到限制,只有一种选择,其它位置任选。
否则,转移系数为$2^{m-2}$,表示两个位置均任选。
这个式子可以简单地化简,变成
$ans=\sum \limits_{i=0}^{m-1} \sum \limits_{j=i}^{m-1}2*f[i]*f[j]*2^{m-2}$
$=\sum \limits_{i=0}^{m-1} \sum \limits_{j=i}^{m-1}f[i]*f[j]*2^{m-1}$
这样暴力打,复杂度是$O(nm^2)$的,随便优化一下就$O(nm)$了。