CodeChef 2020 August Long Challenge 题解

由于人菜,还是 Div.2。

要掉分了 /dk

CHEFWARS

模拟。

LINCHESS

模拟。合法当且仅当是 \(k\) 的约数。

CRDGAME3

模拟。最小位数显然是 \(\lceil\frac{n}{9}\rceil\)

SKMP

先把 \(T\)\(S\) 中去掉,容易发现剩下的字母和对应出现次数是固定的。

显然把它们排序最优,然后再选一个位置把 \(T\) 插进去。

容易发现,若插进去的位置左边有大于 \(T_1\) 的字母肯定不优,右边有小于 \(T_1\) 的字母肯定不优。

又容易发现,最优解中要么所有等于 \(T_1\) 的字母都在插进去的位置左边,要么都在右边。

两者比较一下即可。

时间复杂度 \(O(n)\)

CHEFWED

简单 dp。过于显然不说了。

时间复杂度 \(O(n^2)\) 或者更优。

SUBSFREQ

计数学傻了差点不会做 /kk

先开桶,设 \(i\) 出现了 \(cnt_i\) 次。那么有:

\[ans_i=\sum_{j=1}^{cnt_i}\binom{cnt_i}{j}(\prod_{k=1}^{i-1}\sum_{l=0}^{j-1}\binom{cnt_k}{l})(\prod_{k=i+1}^n\sum_{l=0}^j\binom{cnt_k}{l}) \]

注意到 \(\sum cnt_i=n\),所以直接暴力枚举 \(j\),如果内层复杂度够优是可以的。

下面以内层第一个括号为例。可能有些加减一的细节,不管了。

时时刻刻维护一个 \(p_j\) 表示括号内的值。那么当加入 \(i-1\)(此时枚举到 \(i\))的时候:

\(j\)\(0\) 枚举到 \(cnt_k\),对这一部分的 \(p_j\) 暴力修改,就是乘上个组合数的前缀和。总共暴力的次数也是 \(O(\sum cnt_i)=O(n)\)

对于 \(j>cnt_k\) 的部分,注意到此时组合数的前缀和不会再变了(\(\binom{cnt_k}{j}=0\)),所以是后缀乘上一个定值。

用线段树或树状数组维护。

时间复杂度 \(O(n\log n)\)

upd:由于某毒瘤模拟赛,我写了个 \(O(n)\) 的。然而由于毒瘤到还卡空间,可能代码不是很能看,不放了。

就是注意到后缀修改乘,可以改成前缀求乘积。而求的前缀是 \(1\)\(cnt_i\) 的每一个,根本不用任何数据结构。

ACCBIP

不同颜色的显然独立(最后用个背包合并就行了),单独考虑每种颜色。

选三条线,能组成三角形,当且仅当斜率不同。

按斜率分类,设一共 \(m\) 类,每类有 \(cnt_i\) 个。接下来 \(x\) 次操作,每次可以选一个非零数减去一,问最后所有无序三元组乘积和的最小值。

每次选择最小的数减一。感受一下很对,证一下也很对。

然而没写 /kk

CHEFCOMP

无智商选手的泪水……

我们倒序考虑删点的操作,变成加点。

建一棵新树。每加入一个点,考虑它周围已经被解放的连通块,把那些连通块对应的子树的根的父亲都设为它。

最后就可以发现,每次操作是在新树上的子树减。

一个点的答案,就是从根到它的路径上,选最短的前缀使它变为非正数。随便搞。

时间复杂度 \(O(n\log n)\)

ANTS

什么都不会。

posted @ 2020-08-17 20:02  ATS_nantf  阅读(261)  评论(0编辑  收藏  举报