只写Div1的
A题其实就是维护前缀最大和,不过这题也有其特殊性,因为原数列本来就是非递减的。所以每次新方块掉下来的时候,只要比较一下先前的最大值和方块最右端的值大小即可。
B题是个简单的组合问题,如果有n个一样的x,其中m个的y一样的,那么总共就有n!/2^m种排列。由于n,m不会特别大,可以在线算,这样就能避免掉除法带来的对模运算的影响。
C题是个原题,黑书P295有解。大概是随意调整就行,反正可以证明一个点不会被调整两次。
D题也是个原题 SRM493的。
最后填充出来的图形,是个联通的“凸”块。
比如所谓联通也就意味着若一行或一列中的两个方块被填了,那么其间的方块也必然被填了。那么这样对于任意行,我们只需记录其被填充的最左边的以及最右边的列数即可。
我们用L[i]记录第i行的被填充的最左边的列数,R[i]记录右边的。一组L和R即可以表示出一个唯一的图形。
为了满足“凸“这个要求,L必须先是非递增再是非递减的,R则是先非递减再非递增。
对于第i行来说,填充的时候只需要考虑L[i-1],R[i-1],以及第i-1行L和R数组的单调性。那么我们即可用f[i][l][r][sl][sr]表示第i行填充了l…r这一段,sl,sr表示L,R数组当前的单调性。
状态转移吗,拿f[i][l][r][1][1]来说,其表示的是第i行L数组仍然为非递增状态,R数组仍然为非递减状态,有:
其实还可以再做一些变换,简化运算。
E 游戏论,要用到SG函数。把整个SG函数的表先求出来,然后再做DP就行了,DP没啥难的。