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)的,那么答案一定是(0)或(1),此时直接求每一个数对答案的贡献奇偶性(组合数)就好了。
- 如果没有(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)igoplus sg_2(y)igoplus sg_3(z)=0} inf^{(x+y+z)})。
做到这一步,求(SG)值,直接用(set)就好了,之后的那个统计答案,如果你足够大佬,可以用两次(FWT)解决。
但是可以发现,一个点的(SG)的上限是(O(sqrt{M}))的,于是,我们暴力枚举卷积就好了。
D
简要题意:
定义一种生成长度为(3N)的排列的方法:
初始时有一个空的排列(P),将(1sim 3N)这(3N)个数分成(N)个长度为(3)队列,每次在所有的队首中选一个最小的添加到(P)的末尾,求能生成多少种排列。
题目解法:
因为我太菜了,只会(O(N^3))的(DP),所以就不讲了。
推荐一个大佬的题解:别人家的博客