模拟测试46

Posted hz-rockstar

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟测试46相关的知识,希望对你有一定的参考价值。

T1:

  题意:

    给定一个大小为N的集合,输出任意一种方案,使得子集中所有元素之和是N的倍数。

  题解:  

    考虑前缀和,当前缀和在取模意义下相等时,就为一种答案。

    我们发现0~N一共有N+1个前缀和,但只有0~N-1的N个取值,根据抽屉原理,至少有两个前缀和相同。

    于是这题就解决了。

    时间复杂度$O(N)$。

T2:

  题意:

    给定N个数,求至少删去几个数,使剩下的数能够组成一个相邻元素不相等的排列。

  题解:

    方案合法,当且仅当任何一个数的出现次数不大于其他数总次数加一。

    所以删去的数个数为$max(0,2*ma-n-1)$。

    看似简单却有问题,N<=50000000,而内存仅有16MB。

    用一个id表示当前元素,cnt表示个数。

    从前向后扫一遍,若cnt==0,则使id等于当前A[i],其他条件下,若id==A[i],则cnt++,反之则cnt--,最后的id即为最多的元素。

    中途如果cnt被减成0,那么当前他一定不能满足答案,同时其他值也不能,那么这段就可以被删掉。

    最后再扫一遍求出ans即可。

    时间复杂度$O(N)$。

T3:

  题意:

    给N个数,每次将每个数亦或0~(1<<m)-1中的一个值,将其从大到小排名,将每个数的权值加上排名的平方,排名从0开始。最后输出所有数的全职磨1e9+7的亦或和。

  题解:

    从零开始排名,相当于求每轮大于x的值的个数。

    求出f[i],表示前i-1位与x相同,第i位与x不同的数的个数,可以trie树解决,位数从高向低数。

    把平方看作两个人,则权值为每轮两个人的数同时大于x的方案数的总和。

    枚举f[i]和f[j]。 

    由于前i-1位相同,故亦或的数当该两位为特定值时,满足上述条件。

    两位已经固定,则一共有$2^m-2$个值可供亦或。

    注意i与j不能相同。

    答案为:

      $\sum_i=1^m \sum_j=1^m [i!=j]*f[i]*f[j]*2^m-2$

    时间复杂度$O(NM^2)$

以上是关于模拟测试46的主要内容,如果未能解决你的问题,请参考以下文章

[考试反思]0918csp-s模拟测试46:残存

模拟测试方法

在 SwiftUI 单元测试中禁用模拟器

模拟函数以引发异常以测试除块

阶段总结20190919

在 Android Studio 中运行检测测试而不模拟用户操作