Fork me on GitHub 返回顶部

AGC043 A~C 解题报告

A

简要题意:

有一个\(N*M\)的棋盘,每次操作可以选择一个矩形反转。
求最少操作次数,使得能够从\((1,1)\)只经过白色格子而且只向下或向右到达\((N,M)\)

题目解法:

我们考虑答案路径\(L\),发现如果\(L\)中有\(x\)段黑色的连续段,那么答案就是\(x\)了。
知道了这个,那么我们设\(dp[i][j]\)表示走到\((i,j)\)的最小段数,转移非常简单。

B

简要题意:

有一个长度为\(N\)的只包含\(1,2,3\)的序列。
一次变换之后,会变成长度减一的序列,其中,第\(i\)个元素\(a_1[i] = abs(a_0[i - 1] - a_0[i])\)
求出这个序列进行\(N-1\)次变换之后是哪一个数字。

题目解法:

我们先模拟一次变换,发现序列中的值就之后\(0,1,2\)了。
那么就可以发现,答案一定是\(0,1,2\)中的一个。
之后我们考虑怎么才可能令答案是\(2\),容易发现,如果最后答案是\(2\),那么从第一次变换之后,就不会有\(1\)了。

简易证明: 如果要出现一个2,那么之前两个数就是\(0,2\),再之前就是\(0,0,2\)\(0,2,2\),再往前考虑,可以用归纳证明。

那么我们分一次变换之后有没有\(1\)考虑就行了。

  1. 先考虑有\(1\)的,那么答案一定是\(0\)\(1\),此时直接求每一个数对答案的贡献奇偶性(组合数)就好了。
  2. 如果没有\(1\),那就只有\(0,2\),将每一个数都除以二,就变成第一种情况了。

C

简要题意:

有三个\(N\)个点的简单无向图,边数分别是\(M_1,M_2,M_3\),定义\(G\)是这三个图的笛卡尔积。
其中,有\(N^3\)个点,用\((i,j,k)\)表示,有\((M_1+M_2+M_3)N^2\)条边,用\(<(i,j,k),(x,y,z)>\)表示。
我们令一个点\((i,j,k)\)的权值是\(10^{18(i+j+k)}=1000000000000000000^{(i,j,k)}\)
求出图\(G\)的最大权独立集。

题目解法:

因为是\(10^{18}\)的幂,而\(10^{18} > N^3\),所以我们可以将\(10^{18}\)当成\(inf\)
那么如果能选一个\(inf^i\),就算选了它之后,所有的\(inf^{j},j<i\)都不能选,也不会差。
那么我们就有一个\(O((N+M)^3)\)的做法了,从小到大枚举那\(N^3\)个点,如果能选,就选(注意,因为大小相同的点没有边,所以是对的)。
我们考虑一个点能不能选的判定:

如果与这个点相邻的所有比它大的点都没有被选,那么他才可以选。
反之,只要有一个与它相邻的且比它大的点被选了,那么他就不能选。

是不是很熟悉?回忆 普通\(DAG\)上的博弈,发现能选就对应了必败,必胜就不能选。
于是考虑使用博弈论解决这个问题。
我们将每一条边规定由小的点指向大的点,那么出度为\(0\)的点都是必败的,\(SG=0\)
而且我们发现每一次转移都只改变一维,那么我们三维之间就是独立的了。
我们设\(sg_i(u)\)表示第\(i\)个图中,\(u\)结点的\(SG\)值。
那么\(Ans = \sum_{sg_1(x)\bigoplus sg_2(y)\bigoplus sg_3(z)=0} inf^{(x+y+z)}\)
做到这一步,求\(SG\)值,直接用\(set\)就好了,之后的那个统计答案,如果你足够大佬,可以用两次\(FWT\)解决。
但是可以发现,一个点的\(SG\)的上限是\(O(\sqrt{M})\)的,于是,我们暴力枚举卷积就好了。

D

简要题意:

定义一种生成长度为\(3N\)的排列的方法:
初始时有一个空的排列\(P\),将\(1\sim 3N\)\(3N\)个数分成\(N\)个长度为\(3\)队列,每次在所有的队首中选一个最小的添加到\(P\)的末尾,求能生成多少种排列。

题目解法:

因为我太菜了,只会\(O(N^3)\)\(DP\),所以就不讲了。
推荐一个大佬的题解:别人家的博客

posted @ 2020-04-16 15:16  tacmon  阅读(145)  评论(0编辑  收藏  举报