2023.6.3 NOI模拟赛总结

1.时间安排

7:10~8:50

T1:看上去感觉很简单的图联通块计数,感觉枚举子集是很简单的,应该能做 \(O(3^nm^2)\)

T2:关于极差的构造,\(O(n^4)\) 的DP是简单的,01状态也许能 bitset 优化。

T3:串串题,题目是裸的区间Z函数和,但是我不会求Z函数,可以用SAM代替,\(O(n^2)\) 是简单的。

然后硬造T1的状压DP,始终记重,主要在于我是枚举两个不交集合拼起来,但是拼的时候很难通过容斥来控制选的边数,就寄了。

8:50~9:30

10分钟写了T2的30分暴力DP,不想写SAM用30分钟写了T3的暴力二分+hash。

9:30~11:00

决定换一换T1的思路,改成枚举边,加入一条边更新一下每个联通块的答案,复杂度很炸,\(O(3^nm^3)\),经过一番大卡常后60分的数据可以跑进2s内。

11:00~12:00

写了个SAM,发现本质上是区间内所有点与一个给定点的lca的深度之和,但不完全是,还要和每个点所代表的后缀长度取min,这个取min非常恶心,转化了半天都不会做,只能卡卡常希望 \(O(n^2)\) 能多过几分。

result:

T1:10 T2:30 T3:30

2.总结

T1:

尊重读题,尊重模数,tmbd直接粘的取模板子基准是998244353,这题搞个1e9+7没看到,shaber,改了轻松60。

我那个逆天的DP需要以边为状态,没有出路,所以只能改成正解的那种DP。

考虑枚举让 \(s\) 连通用 \(i\) 条边的方案数,如果不考虑连通就是 \(C_{sz_s}^{i}\),其中 \(sz_s\) 表示集合 \(s\) 的导出子图所含边数。

然后考虑容斥,枚举一个含 \(1\) 的子集 \(t\),要求 \(t\) 是连通块,其他随意,那么就是 \(f_{s,i}=C_{sz_s}^{i}-\sum_{t\subsetneq s \and 1\in t}\sum_{j}f_{t,j}C_{sz_{s\setminus t}}^{i-j}\)

这样复杂度是 \(O(3^nm^2)\)

然后考虑把所有 \(sz_{s\setminus t}\) 放在一起转移,就可以轻松做到 \(O(3^nm)\)

这个逆天的东西是可以通过卡上下界AC的,不好评价。

这波主打一个突出尊重容斥。

T2:

\(n^2\) 的做法开始都和正解相关,也就是暴力只有30分,真好。

\(a\) 序列差分。令 \(c_{i}=a_i-a_{i-1}\),那么有 \(b_i=\max(|c_{i-1}|, |c_i|, |c_{i-1}+c_i|)\)

考虑先DP出一个合法的 \(|c_i|\) 序列,再决定每个差分的符号。

\(f_{i,j}\) 表示前缀 \(i\)\(|c_i|=j\) 是否有合法方案。

转移分三类:

做完后再做一个确定符号的DP,这个按照 \(b_i=\max(|c_{i-1}|, |c_i|, |c_{i-1}+c_i|)\) 来做就好。

观察到状态只有01,并且1的位置满足是一个区间加上若干单点,于是可以维护区间和单点,用 std::deque,转移形如把队列移除若干队首或队尾,清空队列,在队列加入1个元素,新建一个区间,都是能维护的。

细节非常多,复杂度 \(O(n)\)

T3:

咕。

posted @ 2023-06-03 19:25  Displace  阅读(16)  评论(0)    收藏  举报