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)\)
浙公网安备 33010602011771号