CF 1257 题解

CF 1257 题解

A Two Rival Students

每次交换都可以让距离增加 \(1\), 上界是 \(n-1\).

题目说至多而不是恰好交换 \(x\) 次, 于是不需要考虑边界.

B Magic Stick

一个重要的观察是: 如果能够得到 \(x\), 那么就能得到任意小于等于 \(x\) 的数, 这是操作二保证的.

考虑操作 \(1\) 有什么用:

首先, 一个观察是, 如果我有 \(2^k\), 那么我就能得到 \(3^k\), 这个增量是不小的, 而我们还可以再把 \(3^k\) 减掉一个数把它变成 \(2\) 的指数次幂, 再重复这个过程, 这个过程能否一飞冲天呢?

进行一些尝试:

考虑我现在想找到一个数 \(x\), 它能够变成 \(10^9\) 以内的任何数.

如果它能够变成 \(3^{19}=1162261467\), 那它一定合法;

因此如果它能变成 \(2^{19}=524288\) 就可以了;

这个数加上一个数约束严格更强, 把它变成 \(531441=3^{12}\);

因此有 \(2^{12}=4096\) 就够了.

以此类推:

\[2^{12}=4096<6561=3^8\\\rightarrow 2^8=256<729=3^6\\\rightarrow 2^6=64<84=3^4 \\ \rightarrow 2^4=16<27=3^3\\\rightarrow 2^3=8<9=3^2\\\rightarrow 2^2=4<9=3^4\\\rightarrow 2^4\ldots \]

我们发现, 大于等于 \(4\) 的数能变成小于等于 \(10^9\) 的任意数, 那小于 \(4\) 的怎么办呢?

模拟一下就能发现, \(3\) 能变成 \(1,2,3\), \(2\) 能变成 \(1,2,3\), \(1\) 能变成 \(1\).

C Dominated Subarray

发现一个合法序列至少要有两个一样的元素, 找最近的两个相邻元素距离即可.

D Yet Another Monster Killing Problem

发现这个怪物需要顺序的打, 那只能 dp 了.

\(f_i\) 表示打败前 \(i\) 个怪兽需要的最少天数.

\(lst_i\) 表示第 \(i\) 天至多到第 \(lst_i\) 可以一次杀完, 发现如果一个集合里的怪兽可以一次杀完, 那么它的子集都可以, 因此这个贪心是对的, 而且有可二分性.

考虑如何 check.

我们二分到一个 \(mid\) 作为 \(lst_i\), 那么需要:

\[\exist k, stat. i-mid\leq s_k , \max_{j=mid+1}^ia_j\leq p_k. \]

抽象出来, 现在有 \(m\) 个点 \((x_i,y_i)\), 每次询问给一个点 \((x_0,y_0)\), 请你回答是否存在点 \(k\) 使得 \(x_k\geq x_0,y_k\geq y_0\).

维护一个横坐标递增, 纵坐标递减的链, 找到第一个横坐标能够包住 \(x_0\) 的, 看看 \(y_k\) 是否能包住 \(y_0\).

这个链用单调栈即可.

二分套二分, 复杂度 \(O(n\log^2n)\).

E The Contest

发现操作数等于初始时不在指定位置的元素数量.

我们钦定结束时 \(A\) 掌管 \([1,l)\) , \(B\) 掌管 \([l,r)\), \(C\) 掌管 \([r,n]\), 其中 \([1\leq l\leq r \leq n + 1]\).

根据上面的理论, 则有:

\[ans=\sum_{a\in A}[a\geq l]+\sum_{a\in B}[a<l]+\sum_{a\in B}[a \geq r]+\sum_{a\in C}[a<r] \]

这样, 答案就拆成了 \(ans=f_l+g_r\) 的形式, 可以拆开算了.

先用差分优化区间加来求出来 \(f\)\(g\), 然后考虑, 我们枚举 \(l\) 的值, \(r\) 的唯一约束是 \(r\geq l\), 因此:

\[ans=\min_{l=1}^{n+1}(f_l+\min_{r=l}^{n+1}g_r) \]

\(g\) 用后缀和即可.

F Make Them Similar

发现前面一半和后面一半的二进制位是独立的, 可以前后分开搜两边.

设对于一个 \(x\) 来说, 前一半二进制位得到的 popcount 是 \(a_i\), 后一半是 \(b_i\), 那么有:

\[a_1+b_1=a_2+b_2=a_3+b_3\dots \\ \rightarrow \forall k, a_1-a_k=b_k-b_1 \]

这可以转化为一个字符串相等的问题. 用 hash 维护, 然后把两边搜出来的东西查看 hash 是否有一致的.

G Divisor Set

对于一个集合 \(A\), 寻找它的一个最大子集族 \(\mathcal{F}\) 使得其中任意两个集合互不包含, 那么 \(|\mathcal F|=\binom{|A|}{\lfloor\frac{|A|}{2}\rfloor}\).

首先, 容易构造这样一个方案, 充分性显然.

下证必要性:

\(F\) 中的每一个元素 \(S\) , 把 \(S\) 的全排列 和 \(A/S\) 的全排列做组合, 有 \(|S|!(|A|-|S|)!\) 种方案.

把所有的 \(S\) 得到的结果拼到一起, 得到一个排列, 由于 \(F\) 中的元素互不包含, 那么序列是不重的, 则有下面的式子:

\[\sum_{i=1}^ts_i!(n-s_i)!\leq n! \\ \rightarrow 1\geq\sum_{i=1}^t\frac{1}{\binom{n}{s_i}}\geq \sum_{i=1}^t\frac{1}{\binom{n}{\lfloor\frac{n}{2}\rfloor}} =\frac{t}{\binom{n}{\lfloor\frac{n}{2}\rfloor}}\\ \rightarrow t\geq\binom{n}{\lfloor\frac{n}{2}\rfloor} \\ \]

这个结论对于数字一样成立, 证明特别复杂 不会

求方案数相当于你现在有 \(k\) 种物品, 每种物品有 \(s_i\) 个, 满足 \(\sum_{i=1}^ks_i=n\), 请你选出 \(\lfloor\frac{n}{2}\rfloor\) 个.

这个问题相当于一个背包, 而背包就等价于卷积. 我们设 \(F_i(x)=\sum_{k=0}^{s_i}x^k\), 答案即为 \([\lfloor\frac{n}{2}\rfloor]\prod_{i=1}^kF_i(x)\), 现在的问题是怎么快速的求出来所有的多项式乘起来.

实际上是好做的, 每次考虑用前面一半的结果和后面一般的结果做 NTT 即可, 递归的去做, 每一层的复杂度单 log, 有 log 层, 因此总复杂度 \(O(n\log^2n)\).

posted @ 2024-11-11 15:34  snowycat1234  阅读(127)  评论(0)    收藏  举报