CF364A Matrix
直接一个矩阵的和就是原串两段的和的乘积。
可以枚举原串上的段,然后用 unordered_map
维护一下即可。
特判 (a=0)。时间复杂度 (Theta(n^2))。
CF364B Free Market
很,难啊!先考虑第一个答案:
肯定是最大的 (i) 满足:(forall j<i:sm_j+dge a_j)。
然后考虑到第一个答案很小,可以背包出每个可以选到的价值和。
然后有个结论:每两个和 (s_0,s_1) 只要满足 (s_0+dge s_1) 就可以交换。
为什么呢?相当于把 (s_0-s_1) 换成 (s_1-s_0) 了。
然后可以再 dp
一次,用一个单调队列维护,(f(s)) 表示凑成 (s) 最小步数。
时间复杂度 (Theta(n^2 v))。
CF364C Beautiful Set
因为每个用了的质数都得用一半,所以考虑尽量少用质数。打表:
如果只用 (1) 个质数,(2) 最优,可以满足 (nle 8),并且正好满足过半要求。
如果只用 (2) 个质数,(2,3) 最优,可以满足其余的 (nle 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) 同理。