Codeforces-156

刷小号。差一点就可以虐场了 T_T。

Solution

A

签到题。q 只需求个 min 就可以了,然后把 a 排序一路扫过去,能用就用。

B

dp 。先要转换一下思路,把答案分成若干份: ans = 前 1 个人能塞进去的概率 + 前 2 个人能塞进去的概率 + 前 3 个人能塞进去的概率 ……

然后就可以 dp 了。令 f[i, j, k] 表示前 i 个数中选了 j 个数,这 j 个数的和为 k 的方案数。然后枚举当前数选不选即可。

提供另一种思路:统计每个数字出现的次数,令这个数组为一个状态,每次枚举选哪个数。记忆化一下即可。

C

先把这个表打出来,统计每行的和,发现 m + 1 行的数的和为 2^g(m + 2) ,其中 g(x) 表示 x 的二进制表示中 1 的个数。然后就是一个简单的数位统计题了。

D

被卡常数了求破。

如果 t > maxb \|\| t > n ,那么显然可以直接输出 b 中不同数的个数。

这样就可以保证序列的长度不超过 nt 也就是 2 * 10^7 。然后暴力跑最长上升子序列即可。

注意时间复杂度的估计,不是 O(nt log nt) 的,而是 O(nt log ans) 的,而 ans < min(n, maxb) ,所以有一个 0.5 的常数。

我当时就是这么写的,但是这样是会 T 的。一个比较简单的剪枝是如果答案到达上限,那么就直接 break 掉。但是仍然会 T 。再加一个常数优化:对于位置 i ,这次二分的位置不会小于上次二分的位置,于是从上次二分的位置开始二分即可。加上这个常数优化就可以过了。

E

不会。挖坑

situation

首先看了 A 题,水之。

然后看完 B 第一反应不会做,第二反应是作业中的一道题,然后就有了这个 idea ,然后 dp 超好写的说。

接着看了 CDE 三个题,感觉都不太会。刷新一遍看到 C 有人出了,于是开 C 。

推了一下没推出啥结论,然后打表发现都是 2 的幂,瞬间想到二进制表示中 1 的个数,然后就有结论了。

写了好久过不了最大的样例,到最后才发现有个地方需要 + 1 我忘记了,浪费了好多时间 T_T 。

借助刚才想的思路,立马写 D 。然后写了个随机的 generator ,发现无压力,于是直接 submit 了。

YY 了一下 E ,暴力 dfs 发现所有合法的数并不多,但是没想到肿么处理。于是 cha 人去。结果一个人都没 cha 到。

然后发现 D FST 了。哭瞎。

后来优化了一下常数就过了。

现在 rank 是 20 ,如果 D 没挂,那么可以直接 rank 3 。第一次 CF 是 rank 1 ,第二次是 rank 2 ,第三次是 rank 3 该多好啊。T_T

others

liouzhou_101 D 题同样 FST ,TLE 11 比我还惨。

ryz 怒 cha 两人。

ryz 、XLk、shangjingbo、pty、hyy、ChnLich 一堆人中规中矩,过了 ABC 。

jzp、cwx、gsh、大叔只过了 AB 。

秋锅只过了 A 。

xiaodao 怒挂 B 。

nonsense

闲着无聊把 RSS 架了起来。有兴趣的同学不妨订阅一下嘛。(目测没谁有兴趣……)