Codeforces Round #570 (Div. 3)

A

位数和为\(4\)的倍数,涉及到进位,直接把最近的\(30\)个判断一下就好了

B

最大的可能的为:最小值\(+k\),如果最大值能\(≤\)该值则成立,否则输出\(-1\)

C

先全部选\(b\),看是否能为正,在考虑正的这部分去选\(a\),就等于补掉多少个\(a-b\)

D

有一个明显的坑点就是不能整体赋值,大部分\(t\)掉的都是这个原因

我们统计每种颜色的个数,排好序后单独扔进一个数组,考虑从大到小遍历,每次优先取满足条件的最大值

具体实现就是拿一个指针记录能选的最大值,如果遍历到的值刚好为指针则选择,指针左移;如果大于指针,也选指针;如果小于的话,选该值,将指针赋为该值\(-1\)

E/H

\(lst_i\)表示该字符上一次出现的位置;用\(f_{i,j}\)表示前\(i\)个字符,长度为\(j\)的互异的个数

  • \(lst_i=0\),说明该字符第一次出现,\(f_{i,j}=f_{i-1,j}+f_{i-1,j-1},++f_{i,1}\)

  • \(lst_i≠1\),说明前面出现过该字符了,我们得考虑容斥,显然\(lst_i\)前面与其组成子序列的前缀也能与\(i\)组成相同的子序列,\(f_{i,j}=f_{i-1,j}+f_{i-1,j-1}-f_{lst_i-1,j-1}\)

\(f\)数组成指数级增长,而\(k\)有限,故限制\(f\)不超过\(k\)

每次优先选取最长的子序列,直接统计答案就好了

F

最难的题,用贪心,每次选取最大值,然后除掉因子去选

但我们发现能构造出\(hack\)的数据,比如\(6,10,15,30\),这是因为\(\frac{1}{5}+\frac{1}{3}+\frac{1}{2}>1\),特判一下这种情况就好了

G

posted @ 2019-06-27 06:55  y2823774827y  阅读(369)  评论(1编辑  收藏  举报