Loading

【题解】CF1286 Codeforces Round #612 (Div. 1)

没有 vp

A

B

C

C1 的做法就是问整个串,然后问 \([1,n-1]\),用 map 维护,找到所有的后缀可以轻松还原。

C2 考虑还原出前一半,然后问整个串,按照串长分类讨论字符的出现次数就能求得后一半。

代码(C1):Submission #133319703 - Codeforces
代码(C2):Submission #133322011 - Codeforces

D

答案只会在相邻的粒子取到,不同的答案一共有 \(2n\) 中,将这些方案按照碰撞时间排序。

排好序后从小到大依次考虑每个方案作为答案的概率,此时要处理的限制是若干形如"如果 \(i\)\(a\) 方向跑,那么 \(i+1\) 就不能往 \(b\) 方向跑"的东西。线段树维护矩阵即可。

代码:Submission #133328877 - Codeforces

E

每一次的答案就是在 kmp 的 fail 祖先链上求。

讨论 \(i\)\(i+1\) 的祖先链的不同之处,可以发现 \(i+1\) 的祖先链是 \(i\) 的祖先链上的若干祖先首尾同时加上新字符得到的,并且这些祖先左端点不变。

那么维护往上跳的第一个需要删除的位置,暴力删除所有应该删除的位置,用树状数组维护左端点,然后单调栈处理贡献即可。

代码:Submission #133363357 - Codeforces

F

可以注意到删成环的话是可以调整为 DAG 的,所以最终是以某种顺序删成一个 DAG 。因此只需要考虑 DAG 怎么删。接着可以发现 DAG 也没必要我是伞兵,因为边能换成单点,操作次数不变,单点自由度更高。

最终只剩下森林了,考虑一个树要长成什么样才能完全删掉(如果能完全删掉的话,那么可以节省下来一次操作,因此我们想要这样的树尽可能多),画图可以发现,如果按照剥叶子的方式考虑,那么最后的限制形如奇数层和偶数层的差在一定范围内,并且通过翻转每次向父亲走时计算的 \(1/-1\) 可以变成 \(0\)(也就是奇偶性限制)。

最后算的时候枚举子集分奇偶层,然后 dp 同样枚举子集一棵树加入即可。时间复杂度 \(O(3^n)\),好像可以做到更优。

代码:Submission #133402079 - Codeforces

posted @ 2021-10-29 09:37  Qiuly  阅读(103)  评论(0编辑  收藏  举报