atc 板刷计划
ARC213A
题目
中文题目
肯定是 \(dp\),设 \(dp[i]\) 表示在第 \(i\) 个排列处获得奖励时, \(1\) 至 \(i\) 最多可获得奖励之和。
转移是 \(dp[i]=max_{p_j可在 i-j步内变到 p_i}\{dp[j]\}+c_i\)
可以注意到 \(L\) 非常小,并且该题的操作为相邻位交换代表着两个排列的最大距离为 \(\frac{L(L-1)}{2}\)(最大也就 \(36\))。所以我们在转移时,对 \(i-36\) 及之前的 \(j\) 我们知道其必然可 \(p_j\rightarrow p_i\),那么用一个变量记一下这些 \(dp[j]\) 的最大值,再对 \(i-35\) 到 \(i-1\) 范围内的 \(j\) 暴力转移一下就可以。
code
ARC213B
题目
题目大意: 定义集合 \(S\) 满足集合内任意两个数 \(x\) 和 \(y\) 都满足 \(popcount(x\oplus y)\geq2\)。给定 \(L\),\(R\),求由 \([L,R]\) 范围内的所有数能组成的最大集合 \(S\)。
之前一直在想把把所有满足 \(popcount(x\oplus y)\geq2\) 的 \(x\) 和 \(y\) 连边,但是发现这种连边方式没有传递性,即 \(x-y-z\) 不代表 \(x-z\)(但我一直以为是有传递性的所以一直 WA)。
所以考虑直接把 \(popcount(x\oplus y)=1\) 的 \(x,y\) 连边,虽然还是没有传递性但是我们可以发现这有个很好的性质(估计是不 oi 太久了怎么这都忘了):连出来的图是二分图,而我们所要求的 \(S\) 最大 \(size\) 就是这张二分图的最大独立子集。
二分图最大独立集等于点数减去最大匹配
所以转换成求这个二分图的最大匹配。
可以注意到所有 \(2i\) 和 \(2i+1\) 之间都是有连边的。所以只要 \(L\) 为偶数,那么最大匹配数就等于 \(\lfloor\frac{R-L+1}{2}\rfloor\)。
同时,当 \(L,R\) 同时为奇数时,区间长度即 \(R-L+1\) 为偶数,所以答案必为 \(\frac{R-L+1}{2}\),证明可见 link。
所以现在只需考虑 \(L\) 为奇数,\(R\) 为偶数的情况。
首先,\([L+1,R-1]\) 必然可以相邻两两配对。
然后,既然是一张二分图,由匈牙利算法可知,只需找到 \(L\rightarrow R\) 的一条增广路即可最大匹配数 \(+1\)。
因为图中每走一条边,\(popcount\) 就会加减 \(1\),所以,如果 \(L,R\) 的 \(popcount\) 奇偶性相等,那么就不存在增广路。
如果 \(L,R\) 的 \(popcount\) 奇偶性不相等,我们考虑构造一条增广路:
先找到 \(x,y\) 二进制下从高位到低位第一个不相等的位置,记为第 \(k\) 位,若存在 \(u\) 使得 \(L\leq u\) 且 \(u+2^k\leq R\) 即 \(L+2^k\leq R\),那么就一定存在一条增广路。记 \(u\) 为 \(\overline{x0y}\),构造出来是 \(L\rightarrow \overline{x011...1}\rightarrow \overline{x0y}\rightarrow\overline{x1y}\rightarrow\overline{x100...0}\rightarrow R\)。
(因为走一条边的效果相当于在二进制表示下将某一位翻转)

浙公网安备 33010602011771号