2021.10.16 模拟赛题解

卡常屑赛一场,出题人 nmsl(不过好像这么说 chasedeath 神仙不太合适 qwq)

不过讲真这场确实有那么一丢丢卡常卡空间罢,尤其是这个 T2,感觉 NOIP 要是让你六个数组开不下用极省内存的办法挤到五个那就有点太过分了

T1

首先对于每种颜色我们设 \(mn_{i,j}\) 表示擦掉 \(j\) 条颜色 \(i\) 的直线后剩余的由颜色 \(i\) 的直线组成的三角形个数的最小值,\(mn_{i,j}\) 可以使用贪心求出——我们考虑将同一斜率的直线看成一类,那么我们每次选择大小最小的一类,并从中删除一个元素即可,正确性显然。

求完了 \(mn\) 数组之后,求解答案的过程就一遍背包即可,注意 \(v_i=0\) 的情况,如果不注意有可能会出现自己更新到自己的情况,我赛时就因为没注意挂成了 \(40\)/dk

T2

这是一个 \(n\log n\) 的做法,\(\mathcal O(n)\) 的做法因为没看懂空间怎么卡就没写(

考虑枚举出现次数最多的是哪个数,设为 \(v\),并枚举它的出现次数 \(c\),设 \(x\) 在原序列中出现次数为 \(cnt_x\),那么可以轻松写出式子:\(\dbinom{cnt_v}{c}\prod\limits_{x<c}(\sum\limits_{j=0}^c\dbinom{cnt_x}{j})\prod\limits_{x>c}(\sum\limits_{j=0}^{c-1}\dbinom{cnt_x}{j})\),直接计算显然不可取,不过如果我们考虑正序枚举 \(c\),那么可以发现只有 \(cnt_x\ge c\)\(x\)\(\sum\limits_{j=0}^c\dbinom{cnt_x}{j}\)\(c\) 自增时会发生变化,因此我们只用暴力修改这些位置上的值,然后树状数组维护前后缀积即可,时间复杂度 \(\sum\limits_{x}cnt_x·\log n=n\log n\)

T3

考虑时光倒流,删边变成加边。加边时求个 Kruskal 重构树,这样我们可以求出每个操作会影响到哪些点,打个子树标记。然后在 Kruskal 重构树上一遍 DFS,DFS 到叶子节点时在对应的祖先栈上二分一下即可。时间复杂度 \(n\log n\)

T4

考虑将存在性问题转化为计数问题,我们求出 \(cnt_{i,j}\) 表示有多少个大小为 \(i\) 的连通块,其边界上包含的图片的状态为 \(j\),那么第 \(i\) 行第 \(j\) 列的值为 \(1\) 当且仅当 \(cnt_{i,j}\ne 0\),否则那么第 \(i\) 行第 \(j\) 列的值为 \(0\),这个可以通过模上一个大质数(譬如 \(1004535809\))来解决。

接下来思考如何求 \(cnt\)。考虑树形背包,设 \(dp_{i,j,s}\) 表示有多少个以 \(i\) 为根的连通块,满足其大小为 \(j\),且边界上包含的图片的状态为 \(s\)(注:这里的边界不包含 \(i\) 与其父亲相连的边,这条边的贡献可以在统计答案时算出),不难发现合并两个子树时相当于做 or 卷积,FWTor 一下即可实现 \(\mathcal O(2^k)\) 卷。每次树形 DP 合并两个子树时都 IFWTor 复杂度是 \(2^kn^2k\) 的,无法通过。不过由于 FWTor 和 IFWTor 都是线性变换,因此可以先把贡献累加到 \(cnt_{i,j}\) 中后再 IFWTor,这样复杂度就降到了 \(2^kn(n+k)\),可以通过。

然鹅这道题巨卡常……身为自带大常数选手的我到现在还没通过/dk

posted @ 2021-10-17 17:57  tzc_wk  阅读(15)  评论(0)    收藏  举报