题解-CF364
CF364A Matrix
直接一个矩阵的和就是原串两段的和的乘积。
可以枚举原串上的段,然后用 unordered_map
维护一下即可。
特判 \(a=0\)。时间复杂度 \(\Theta(n^2)\)。
CF364B Free Market
很,难啊!先考虑第一个答案:
肯定是最大的 \(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)\)。
CF364C Beautiful Set
因为每个用了的质数都得用一半,所以考虑尽量少用质数。打表:
如果只用 \(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\) 在数据范围内的所有。
然后直接分段暴力即可。
CF364D Ghd
假如已经知道了一个在选中集合中的数,直接求出别的数和它的 gcd
,
然后 \(\Theta(d(a)^2)\)(\(\max d(10^{12})=6720\))求出每个 gcd
满足集合大小即可。
所以随机化,每次随机选一个数,假设它在集合中,做 \(10\) 次错误率就只有 \(\frac{1}{1024}\)。
CF364E Empty Rectangles
感觉思路很简单,但是好难想到啊。
就是分治,将问题转化为求跨过中线的子矩阵数。
比如中线是横着的,可以先枚举矩形的左边界 \(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\) 同理。