题目描述
如题所示,这将是一个关于设置的问题。
你需要通过对一个控制台进行设置,来得到不同的效果。
这个控制台由n个控制元件组成,每个元件有m种设置,其中i号元件的第j种设置将会给整体带来a[i][j]的效果值。
最终的效果值是所有n个元件所选设置的效果值之和。
然而,效果值并不是越大或越小越好,不同的效果值有不同的意义。
所以我们要求你给出效果值最小的那k种不同的方案(2种方案不同,当且仅当2种方案中存在至少1个元件的设置不同)。
不过由于我们其实并不关心你给出的那k种方案是什么,只需要弄清你是否能够找出那些方案,所以你只需要输出所有k种方案的效果值的异或和。
输入
第一行3个正整数n,m,k
接下来n行,每行m个非负整数,其中第i行第j个数表示第i个控制元件的第j种设置的效果值a[i][j]
输出
仅一行一个整数,表示k种方案的效果值的异或和
样例输入
3 2 2
11 21
9 25
17 19
样例输出
2
样例说明
最小的2种方案的效果值分别为37(11+9+17)和39(11+9+19),异或和为37 xor 39 = 2
数据规模和约定
对于30%的数据,m^n<=10^6,k<=30000
对于另外30%的数据n<=100,nm<=50000,k<=50000
对于100%的数据,nm<=300000,k<=300000,保证m^n>=k,任意一个控制元件的任意一种设置效果值均不超过10^9
Solution
非常牛逼的枚举。。。 可以推广。
这其实是一个用堆求k优解的一般思路。
先对于每个i,将元件i的a[i][1]~a[i][m]从小到大排序,再将所有元件按照其(第2~第m种设置与第1种设置的差值)多关键字从小到大排序(共m-1个关键字)。
现在开始,我们将排在第i位的元件称为元件i,其第j小的设置称为元件i的设置j。
那么我们知道,最小的方案肯定是所有元件都设置为1。由于其有一些特殊,我们先抛开这个方案。(实际上不抛开也是可行的)
我们知道,次小的方案是(2,1,1,1…),我们以此为起点s,由较优方案扩展较劣方案,对于每一个方案,我们记录其最后被扩展的位置(对于s,这个位置为1)。在已经得到前t优的方案时,当前所有方案中还未扩展的最好的方案x(其最后扩展位置为i),就是第t+1优。
从方案x,我们可以扩展出几个较劣解:
1、 i < n:将i+1号元件设置为2(扩展位置为i+1)
2、 x的第i个元件设置为2且i < n:将i号元件设置为1,i+1号元件设置为2(扩展位置为i+1)
3、x的第i个元件设置不为m:将i号元件设置增加1(扩展位置为i)
由此,每个解都可由唯一的优于它的解扩展得来。
用堆维护当前所有解即可。
以上方法保证了每次枚举的值都比之前的大并且没有遗漏。
不过还是调了很久
- 这题枚举不能从1111开始,会出现等于的情况导致重复。
- qsort打错了 mid要放在循环外面啊orz
- 进一步理解了怎么用c++指针
1 |
|