省选模拟56

A.取石子游戏

题意:n堆石子,第\(i\)堆有\(a_i\)个,可以删除掉为d的倍数个数的石子堆,求后手必胜的删除方案数。\(n<=5e5,d<=10,a_i<=1e6,\sum\limits_{i=1}^n a_i<=1e7\)
首先是nim博弈的结论:存在后手必胜的充要条件为\(a_i\)异或和为零
对于\(n<=50,a_i<=10000\),设\(f[i][j][k]\)表示考虑了前\(i\)堆石子,删除堆数\(%d=j\),未删除的堆xor值为\(k\)的方案数
此时没有用到\(\sum\limits_{i=1}^n a_i<=1e7\)的条件
\(a_i\)按降序排序,那么每次不小于\(a_i\)最高位+1位的k都不可能贡献答案,这样的话复杂度为\(O(nd\times cnt[2^{i-1},2_i-1]2_i)\),不会超过\(O(nd\sum a_i)\)

B.路径计数

题意:n个点m条边的有向图,q次询问s->t走d条边且s只在起点t只在终点经过的方案数。\(n<=100,d<=50,q<=5e5\)
暴力的话直接dp\(f[s][i][t][d]\)表示起点s终点t现在在i走了d条边的方案数,然后统一回答。
限制只有两个,可以考虑容斥。
\(f[i][j][k]\)表示走恰好k步\(i->j\)且不经过\(i,j\)的方案数
\(g[i][j][k]\)表示恰好走k步\(i->j\)的方案数,这个没有限制直接枚举起点拓展终点dp,复杂度为\(O(n^3d)\)
\(h[i][j][k]\)表示恰好走k步\(i->i\)且不经过\(j\)的方案数
考虑如何求答案\(f\)
用总方案数-不合法的,前者显然是g,后面的分类为第一个不合法为i或j
\(f[i][j][k]=g[i][j][k]-\sum\limits_{d=1}^{k-1}h[i][j][d]g[i][j][k-d]-\sum\limits_{d=1}^{k-1}f[i][j][d]g[j][j][k-d]\)
\(h[i][j][k]=g[i][j][k]-\sum\limits_{d=1}^{k-1}h[i][j][d]g[i][i][k-d]-\sum\limits_{d=1}^{k-1}f[i][j][d]g[j][i][k-d]\)
同时注意\(i=j\)的情况会被多减一次。

C.方格操作

题意:\(n\times m\)的01方格图,定义操作为把1的所在行和列异或一,本身变为0。每次对图中所有1同时操作,权值为1的个数,直到图中无1。\(n,m<=1e5\)
定义\(f[i]\)为i行1个数的奇偶性,\(g[i]\)为i列同理
那么\((i,j)\)一轮操作后会变成\(f[i]\ xor\ g[j]\)
因为只关心每个格子所在的行和列有多少1,而不关心具体位置,交换行和列对答案没有影响。
于是把\(f[i]=0\)的放上边,\(g[j]=0\)的放左边,会形成4个块,每个块要变化产生的值都是相同的,将问题的规模缩小到了\(2\times 2\),除了初始方格图只有左下和右上两个块会有贡献,同时可以再次按照此规则移动行列,若不循环则最多\(2^4\)次。
现在的问题在于求出初始图的贡献和\(f[i],g[i]\),后者差分即可,前者用扫描线+线段树可以解决。

posted @ 2020-03-28 21:56  hzoi_yzh  阅读(127)  评论(0编辑  收藏  举报