题意:
给定 \(n\),求最大的 \(|S|\) 使得 \(S\subseteq\{1,\cdots,n\}\) 且对于任意 \(a,b\in S\) 有 \(|a-b|\neq x\) 且 \(|a-b|\neq y\)。
\(n\leq 10^9\),\(x,y\leq 22\)。
题解:
直接上结论:
-
对于一个长为 \(x+y\) 的合法方案,它重复若干次得到的方案也是合法的。
证明:否则若出现非法情况,即存在 \(i,j\) 在相邻两段都被选了且 \(j-i\in \{x,y\}\),那么考虑 \(j\) 对应的上一段的也被选了的位置 \(j-(x+y)\),发现 \(i-(j-(x+y))=x+y-(j-i)\in\{x,y\}\)。这是段内的非法情况,矛盾。
-
最优方案一定是某长为 \(x+y\) 的方案重复无限次后的前缀。
证明:设 \(n\bmod (x+y)=r\)。据此,我们将任意合法方案按如图 A 方式划分为段:
设每一段中被选的元素数量分别为 \(a_1,\cdots,a_{2k+1}\)。找到使得 \(a_{i}+a_{i+1}\) 最大的 \(i\),那么考虑用第 \(i\) 段和第 \(i+1\) 段对应地去替换其他段,根据第一个结论可知替换后方案仍然是合法的。
然后考虑证明替换后答案不劣。不妨设 \(i\) 为奇数(偶数同理),如图 B,根据定义可知绿色段都小于等于红色段,所以绿色段部分整体是不劣的。而根据 \(a_i+a_{i+1}\geq a_{i+1}+a_{i+2}\),可知第 \(i+2\) 段被第 \(i\) 段替换后也是不劣的。从而整体的答案是不变小的。
那么现在只需知道这个长为 \(x+y\) 的方案是什么即可。总贡献相当于给该方案前 \(r\) 个数赋权为 \(k+1\) 而给剩下的后 \(x+y-r\) 个数赋权为 \(k\)。
连边 \((i,i+x),(i,i+y)\),我们要求的实际上是该图的最大权独立集。而注意到在只考虑前 \(x+y\) 个数的情况下,每个数恰好有两条邻边(\(i-x,i+y\) 恰有一者在 \([1,x+y]\) 中,\(i+x,i-y\) 也是恰有一者在 \([1,x+y]\) 中),从而该图是若干个环。而环上的最大权独立集是容易线性求得的。
总时间复杂度 \(O(x+y)\)。
标签:赋权,方案,Set,不劣,结论,Max,合法,CF1463F,替换 From: https://www.cnblogs.com/ez-lcw/p/16999578.html