模拟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)$了。

posted @ 2019-09-19 11:21  skyh  阅读(186)  评论(2编辑  收藏  举报