博客食用更佳 https://www.cnblogs.com/czyty114/p/14691097.html
个人感觉atcoder上的题质量确实很高,比较偏向于竞赛的题型。
A
n个人,m道题,每道题有两个选项。现在给出了这n个人的作答,用n个长度为m的01串来表示。
问:有多少个(i,j),满足第i个人和第j个人做对的题目数量不可能相同。
n≤105,m≤20
显然,如果两个人有奇数道题的答案不一样,他们做对的题目数量不可能相同。
把每个人的答案看成二进制数,问题转化为:异或后有奇数个1的数对有多少个
然后我们发现,如果两个数满足一个有偶数个1,另一个有奇数个1,则一定是满足条件的。
否则一定不行。
简单试试就看出来了。
B
给定n×n的矩阵C
问:能否构造出两个数组A,B,满足:Ci,j=Ai+Bj
n≤500
显然A是每一行的最小值,B就是这行每一列的数与这行最小值的差
O(n2)简单判断一下是否是无解情况就行了
C
要求构造出长度为n的序列,使得对于任意i|j的情况,ai≠aj
要求序列的最大值最小。
n≤105
考虑一个位置的数,限制条件就是它的因数们。
考虑dp,那么一个位置应填的数,一定要比它所有因数下标中,填的数最大的那个+1
即:dpi=max{dpj}+1,这里j是i的因数
所以我们也可以直接枚举倍数去dp,复杂度为调和级数:O(nlogn)
D
给定n个点,m条边的无向图(不保证联通)。
从m条边中选出一些边,与n个点所构成的图叫做生成子图
问:对于k=0,1⋯,n
有k个点的度数为奇数的生成子图有多少个。
n≤5000
对于k为奇数的情况,答案就是0
然后考虑树的情况:
我们发现ansk=Ckn
为什么?
我们从这n个点中选出k个点,然后一定保证有且只有一种构造(选边)方案,使得这k个点度数都为奇数。
下面我们把那k个点称作关键点
证明:因为是k是偶数,所以我们进行两两配对。这样路径的两个端点奇偶性一定会发生变化,且路径中间的点奇偶性不会变。
而且我们必须从下往上逐渐进行配对,每次找到深度最深的点x,满足它至少有两个子树中都有1个关键点
然后两两配对。又发现,配对的过程,必须是选这些关键点与x之间的路径上的边。
感性理解一下就好。
然后考虑非树(即图)的情况
我们一定可以从中找到一颗生成树,剩下m−n+1条边不是树上的边。
这m−n+1条边可以随便选。然后剩下的边又变成了树的情况
虽然选非树边会改变某些点的奇偶性,但是由于变成奇点的数量也一定是偶数个,而k也是偶数。
你会发现这两个玩意合并起来,只考虑树边使要变为奇点的(这里的奇点是只考虑树边贡献的度数)数量也一定是偶数。
这其实与A的思路有些类似。
因此,图的情况即是Ckn×2m−n+1
若有多个连通图,那么只需进行一次简单的dp。
怎么dp就比较显然了。
看起来dp的复杂度是O(n3)的(也有可能是我自己sb了),实际上是O(n2)