Codeforces Round #490 (Div. 3)

A. Mishka and Contest

题意:有 \(n(n \leq 100)\) 个数,每次可以从前面或者后面删掉一个 \(\leq k\) 的数,求最多能删掉几个。

题解:数一下前缀能删掉几个,后缀能删掉几个。

\(O(n)\)

B. Reversing Encryption

题意:有一个字符串 \(s\),和一个数 \(d\),要把所有 \([s_1\cdots s_k]\) 翻转,其中 \(k|d\),求最终的字符串。

题解:模拟,可以用 reverse(s.begin(),s.begin()+k)

\(O(n+\sum \limits _ {i|d} i)\)

C. Alphabetic Removals

题意:有一个字符串 \(s\),每次操作删掉它最左边字典序最小的字符,求 \(k\) 次后的结果。

题解:扫 \(26\) 遍。

\(O(26|s|)\)

D. Equalize the Remainders

题意:有 \(n\) 个数,\(a_1 \cdots a_n\),和一个数 \(m\)。一次操作可以给 \(a_i +1\),求最少几次操作使得 \(\% m=k\ (k \in [0,m-1])\) 的个数都相等。

\(m\leq n \leq 2\times 10^5\)

题解:

先统计出 \(\% m=i\) 的个数 \(cnt_i\)

\(0\) 开始扫,如果 \(cnt_i > \frac{n}{m}\),就 \(ans+=cnt_i - \frac{n}{m}\)\(cnt_{(i+1)\%m}+=cnt_i - \frac{n}{m}\)\(cnt_i=\frac{n}{m}\)

扫两遍。

证明:如果多出来了一个 \(i\),只能把它先变成 \(i+1\) ,不然必然无解。

扫两遍肯定够,因为是个环。

\(O(n+m)\)

E. Reachability from the Capital

题意:有一个有向图,\(n\) 个点 \(m\) 个边,问最少加几个有向边使得 \(1\) 能到所有点。

\(n,m \leq 2000\)

题解:

首先肯定从 \(1\) 往外连边最优。

相当于问最少用几个点可以到达所有点 (必须选 \(1\))。

然后tarjan缩一下点

然后就每个点都 dfs 一遍,如果可以被别的点到达,就不选,强连通分量的话任意选一个。

实现的话,如果某个点可以被别的点走到就不管,否则 dfs 一遍,把所有能到的点标记一下。

\(O(n+m)\)

F. Cards and Joy

题意:有 \(n\) 个人,\(n \times k\) 张卡,每个人拿 \(k\) 个,每个人有一个喜欢的数字 \(b_i\),如果第 \(i\) 个人分到 \(j\)\(b_i\),这种分法的权值就加 \(a_j\),所有分法中权值最大的。 (\(a_1\cdots a_n\) 给定)

\(n\leq 5000\),$ k\leq 10$。

题解:

每种卡片独立,因为每个人如果拿到了自己不喜欢的卡没有效果,所以多出来的卡相当于弃牌。

\(dp_{i,j}\) 表示 \(i\) 张卡分给 \(j\) 个喜欢这张卡的人能达到的最大权值。

枚举当前这个人选了多少个,即可转移。

最后统计答案数一下有几个人喜欢这个卡以及有几张这个卡,直接把 \(dp\) 值加起来即可。

\(O(n^2k^2)\)

posted @ 2020-09-10 23:08  daduda  阅读(114)  评论(0)    收藏  举报