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)$