CF1118总结
A \(\checkmark\)
题目大意
给定数组 \(a\),每次可以选择奇数个下标位置 \(\ge 3\),删掉中间位置的数,可以进行无限次操作,问最终序列的 \(\gcd\) 最大是多少。
\(T\le 10^4 ,n\le 100,a_i\le 10^9\)
解题思路
发现你永远都删不掉第一个和最后一个,所以最优情况是输出 \(\gcd(a_1,a_n)\)。
B \(\checkmark\)
题目大意
有 \(n\) 根木棍,长度分别为 \(a_1,\dots,a_n\)。你可以进行 \(k\) 次操作(\(k=1,2,\dots,m\) 独立求解),每次操作选择一个正整数 \(t\),然后所有长度大于 \(t\) 的木棍都会被同时切成 \(t\) 和 \(l-t\) 两段(长度不超过 \(t\) 的不变)。经过恰好 \(k\) 次操作后,你可以选择一些长度相同的木棍卖掉,问最多能卖掉多少根。对于每个 \(k=1..m\) 输出答案。
简单版本就是只需要计算 \(k=1\) 时的答案。
\(1 \le n,m \le 2\cdot 10^5\),\(\sum n\le 2\cdot 10^5,\sum m\le 2\cdot 10^5\),\(1 \le a_i \le m\)
解题思路
简单版本:\(\checkmark\)
考虑到值域也是 \(O(n)\) 级别,我们从值域入手,我们要算的其实就是 \(\max_x \#\{a_i\ge x\}+\#\{a_i=2x\}\),这两个东西都是可以预处理出来的,然后跑一遍比较即可,复杂度 \(O(m)\)。
困难版本:
与前面一样,考虑我们固定住了 \(x\),那么对于 \(a_i\) 来说它会产生多少贡献呢?
我们发现每次分掉 \(t=2^c\times x\) 这类是非常好的,因为分成两段后,每一段都单独可以再分,比如说对于 \(x=1,a_i=4\),第一次 \(t=2\),第二次 \(t=1\),这样就可以分成 \(4\) 份,这能带给我们启发。
我们不难发现,如果 \(a_i=2^k\times x\),那么它的贡献就是 \(2^k\),否则若 \(a_i<2^k\),贡献就是 \(a_i\over x\),若 \(a_i>2^k\),贡献就是 \(2^k-1\)。
与简单版本类似的,从值域入手,做前缀和。对于每个 \(x\): 算出三种 \(a_i\) 与 \(2^k\times x\) 的贡献即可。
那对于每个 \(k\) 呢?枚举就行,因为最优的 \(x\le {m\over 2^k}\),所以这一段复杂度是 \(O(m\log m)\)。
总复杂度 \(O(n+m\log m)\)
似乎并不是很懂怎么预处理/ll

浙公网安备 33010602011771号