Loading

题解-CF364

CF364


CF364A Matrix

luogu

直接一个矩阵的和就是原串两段的和的乘积。

可以枚举原串上的段,然后用 unordered_map 维护一下即可。

特判 \(a=0\)。时间复杂度 \(\Theta(n^2)\)

aclink


CF364B Free Market

luogu

很,难啊!先考虑第一个答案:

肯定是最大的 \(i\) 满足:\(\forall j<i:sm_j+d\ge a_j\)

然后考虑到第一个答案很小,可以背包出每个可以选到的价值和。

然后有个结论:每两个和 \(s_0,s_1\) 只要满足 \(s_0+d\ge s_1\) 就可以交换。

为什么呢?相当于把 \(s_0-s_1\) 换成 \(s_1-s_0\) 了。

然后可以再 dp 一次,用一个单调队列维护,\(f(s)\) 表示凑成 \(s\) 最小步数。

时间复杂度 \(\Theta(n^2 v)\)

aclink


CF364C Beautiful Set

luogu

因为每个用了的质数都得用一半,所以考虑尽量少用质数。打表:

如果只用 \(1\) 个质数,\(2\) 最优,可以满足 \(n\le 8\),并且正好满足过半要求。

如果只用 \(2\) 个质数,\(2,3\) 最优,可以满足其余的 \(n\le 65\),并且正好满足过半要求。

\(2,3,5\)\(406\)\(2,3,5,7\)\(2094\)\(2,3,5,7,11\) 可以满足其余 \(n\) 在数据范围内的所有。

然后直接分段暴力即可。

aclink


CF364D Ghd

luogu

假如已经知道了一个在选中集合中的数,直接求出别的数和它的 gcd

然后 \(\Theta(d(a)^2)\)\(\max d(10^{12})=6720\))求出每个 gcd 满足集合大小即可。

所以随机化,每次随机选一个数,假设它在集合中,做 \(10\) 次错误率就只有 \(\frac{1}{1024}\)

aclink


CF364E Empty Rectangles

luogu

感觉思路很简单,但是好难想到啊。

就是分治,将问题转化为求跨过中线的子矩阵数。

比如中线是横着的,可以先枚举矩形的左边界 \(l\)

然后枚举右边界 \(r\),依次求出 \(up(l,r,k)\) 表示当下边界是中线时,

最上的上边界,满足子矩阵只有 \(k\) 个黑格子。\(down(l,r,k)\) 同理。

因为这两个东西随右边界是单调的,所以可以 \(\Theta(nm)\) 求出。

然后对于每个 \(l,r\),贡献为 \(\sum ua(k)\cdot da(K-k)\)

其中 \(ua\)\(k\) 占的区域,可以通过 \(up\) 求出,\(da\) 同理。

aclink


\[\Huge\rm Let\ the\ dark\ corners\ absorb\ the\ red\ blood! \]

posted @ 2020-12-29 16:43  George1123  阅读(237)  评论(0编辑  收藏  举报