2023.10
[CF618F] Double Knapsack
遇到这种神秘问题我们肯定是想加强一下限制,不然直接做这咋做。
适当地猜一下结论。yhx-12243 指出,这类存在性问题肯定是根据抽屉原理搞一搞。
先猜一个结论:取出 \(a,b\) 的前缀和数组 \(A,B\),答案一定是 \(a[l_1\sim r_1]\) 和 \(b[l_2\sim r_2]\)。即存在 \(l_1,r_1,l_2,r_2\) 满足 \(\sum\limits_{i=l_1}^{r_1}a_i=\sum\limits_{i=l_2}^{r_2} b_i\)。
怎么证明?考虑利用前缀和构造。条件即 \(A_r-A_l=B_v-B_u\),盯不出来所以先换一下,\(A_r-B_v=A_l-B_u\)。考虑找到最大的 \(B_j\le A_i\) 的 \(j\),一定有 \(0\le A_i-B_j<n\),但是我们的 \(i\) 有 \(n+1\) 个啊,这样就构建了抽屉原理的模型。同时给出了一个构造方法,two-pointers 即可 \(\mathcal O(n)\) 算。
然后还有一点是,\(A_n>B_n\) 的话这个关系不对,交换一下 \(a,b\) 就行。
CF1706D2
考虑双指针,判断是否所有数都能放在 \([l,r]\) 这段区间里。
整除分块是 trivial 的但是不牛,因为空间 62.5MB 所以必须卡空间。
考虑倒序双指针,然后用两个 vector 维护一下当前每个数整除分块的进度即可。时间复杂度 \(\mathcal O(n\sqrt n)\)。
CF1718C
就是求每个同余类内部平均权值的最大值。直接用 set 维护每种环长和对应权值是 \(\mathcal O(nd(n)\log n)\),不牛。
考虑这样一件事情,就是 \(\max((a_1+a_2)/2,(a_3+a_4)/2)\ge (a_1+a_2+a_3+a_4)/4\)。对应到这个题里,我们显然只需要取质数环长的同余类即可。\(\mathcal O(n\omega(n)\log n)\)。
CF1526F
考虑我们如果能找到一个很大的质因子 \(p\) 满足 \(\forall s\in [l,r],\gcd(s,p)=1\) 我们就能知道原序列的所有数。但问题是这样的 \(p\) 有可能不存在。2e5 以内最大的质数间隔不超过 100,分类讨论。
- \(n\le 100\):显然可以直接询问 \(n(n-1)/2\) 组关系,用 5000 次左右的询问。根据 \(\gcd(x,x+1)=1\) 找到 \(r,r-1\) 的位置,通过其对应的集合即可得知二者的精确位置。然后不断找 lcm 最大值即可。
- \(n>100\):我们随机询问 5000 次,有很大概率得到一个满足上述条件的质因子 \(p\),具体方法就是找 lcm 的最大质因子,如果比当前答案更大就把它拿过来。然后询问一遍即可。
随机化的思想还是很巧的。
CF1698G
直接做还是太困难了,这问题的限制显然没法化简,没啥好的性质,但是注意到最终状态相当简介,考虑形式化地表述。
去除 \(s\) 前面地前导 0,假设第 2 个 1 在 \(k\),原来的字符串我们给他写成一个幂级数 \(S(z)\),一次操作就是 mod 2 意义下给 \(S(z)\) 乘一个系数 \(z^p\),系数可以合并为一个幂级数 \(F(z)\),那么有:
我们现在就是要求最小的 \(k\)。使得可以构造出一个 \(F(z)\)。因为这个东西就是幂级数求逆,所以必须有 \(z^k+1\equiv 0\pmod{S(z)}\)。然后根据 mod 2 意义化一下就是 \(z^k\equiv 1\pmod{S(z)}\)。
这个形式很像 BSGS 啊,那就考虑 BSGS,考虑答案的上界大概是 \(\mathcal O(2^{\mathrm{deg}\ S(z)})\) 所以取 \(B=10^6\) 就差不多。
考虑 \(k=xB-y(y<B)\),那么化为 \(z^{xB}\equiv z^y\pmod{S(z)}\)。
现在的问题是,如何求 \(F(z)Q(z)\bmod S(z)\)?本质上是一个 mod 2 意义下的卷积,我们枚举 \(F(z)\) 的每一位,所以个类似快速幂的东西即可。
还有一个子问题没有解决,已知 \(F(z)\bmod S(z)\),怎么求解 \(zF(z)\bmod S(z)\)?
- \(\mathrm{deg}\ zF(z)< \mathrm{deg}\ S(z)\),那么直解乘就行,对应二进制下的左移。
- \(\mathrm{deg}\ zF(z)=\mathrm{deg}\ S(z)\):此时需要减去 \(S(z)\),mod 2 下等于加上 \(S(z)\) 或者说异或 \(S(z)\) 对应二进制状态。
然后问题就解决了。时间复杂度 \(\mathcal O(B(|s|+\log B))\)。
很有启发啊,这个题关键是注意到最终状态的简洁性,使用幂级数描述后转化目标,然后使用常见算法求解。
后面几天干啥了来着,好像基本啥都没干。
CSP 了,祝大家好运!
哦突然想起来了我还开了这么一个 blog 是吧,那周末的时候往上放点 UCUP 题。

浙公网安备 33010602011771号