CF Round#167

只写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没啥难的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值