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\),特判一下这种情况就好了