Codeforces Round 963 (Div. 2)
A
对 A, B, C, D
的数量和 \(n\) 取个 \(\min\) 相加
B
只有奇数或只有偶数答案为 \(0\),否则,只能把所有的偶数改为奇数,因为不可能把所有奇数改为偶数。
然后就是改的大小问题了。考虑找到最大的奇数,然后把偶数从小到大依次修改。
C
显然对 \(2k\) 考虑同余就好了,因为循环节长度是 \(2k\) 的。
然后变成一个长度为 \(2k\) 的数轴,求若干个区间的交集。
分成两种区间,一种是包左右两头的,一种是包中间的。
由于这两种区间的交集最多只会有两个区间,直接维护这两个区间就好了。
D
直接 dp,设 f[i][j]
表示考虑前 \(i\) 个数,保留 \(\le j\) 的数,最少保留几个,显然 f[n][j] = (n + 1) / 2
的最大 \(j\) 就是答案了。不难注意到这个东西第二维是单调的,考虑二分这个 \(j\),然后去 dp。
E
假设只考虑对一列 \(j\) 进行修改的操作,可以发现相当于把 \(f(1), f(2), \cdots, f(n)\) 覆盖掉第 \(j\) 列。覆盖之后,新的 \(f'(1), f'(2), \cdots, f'(n)\) 居然就是原来的第 \(j\) 列。
这不是相当于,把 \(f(1), f(2), \cdots, f(n)\) 看作第 \(0\) 列,然后交换第 \(0\) 和第 \(j\) 列么。
不过 \(g(j)\) 被改变了,这个操作不能这么单纯地被描述。但是一看就会发现 \(g(j)\) 变成了所有数的异或和,于是不难想到,定义第 \(0\) 行和第 \(0\) 列,\(a_{0, 0}\) 就是所有数的异或和,\(a_{i, 0} = f(i), a_{0, j} = g(j)\),于是操作变成交换第 \(0\) 行和第 \(i\) 行或交换第 \(0\) 列和第 \(j\) 列。
推广一下,其实就是交换任意两行和任意两列,然后让差值和最小。
那就是给行决定一个排列,列决定一个排列,然后让差值和最小。这时候行、列是独立的。
当题意能简化成简单的一句话时,说明我们建立的模型很对啊!
显然可以求出第 \(i\) 行和第 \(j\) 行的差值,把这个看作边权,变成找到一个最短哈密顿路径。
这个问题我没那么熟悉,思考一下直接状压就能 \(O(n^2 2^n)\) 做完?
F
还不会
标签:奇数,963,Codeforces,偶数,cdots,Div,2k From: https://www.cnblogs.com/lingfunny/p/18344717