CF看题总结

又开了个坑。

就只写思路了,代码有一些没有写,如果不太容易实现的那种我会去写的。

786C:codeforces.com/contest/786/problem/C

对于每个K,可以发现答案不超过n/K,也就是说总共的答案不超过nlnn个,枚举答案的复杂度是可行的。

然后每次找最远端点,二分+主席树会比较慢,正常主席树相当于横坐标是位置i,纵坐标是pre[i],考虑翻转过来,就可以省去二分的过程直接在主席树上二分。

时间复杂度O(nlognlnn)。

786D:codeforces.com/contest/786/problem/D

这题一眼7s O(n^2)可过啊,然后自己造了个链卡到10s。

考虑点分治,当前处理的分治中心为c,对于子树内的x,让所有以x为起点的询问累加贡献,即统计有多少点z使得str(x,y)>str(x,z)且x到z经过c。

考虑先比较一下str(x,y)和str(x,c)的字典序。

如果str(x,y)<str(x,c),则不存在符合条件的z。

如果str(x,y)>str(x,c)且str(x,c)不是str(x,y)的一个前缀的话,所有的点都合法。

否则一定能找到一个x到y路径上的w,使得str(x,w)=str(x,c),这样,由于str(x,z)=str(x,c)+str(c,z)

那么str(x,y)=str(x,w)+str(w,y)=str(x,c)+str(w,y),也就是说要求有多少个str(c,z)<str(w,y)(w是已经确定了的点)。

我们把所有str(c,z)放到trie树上,并找到str(w,y)和trie树中存在的串的lcp所在的串的排名。

上面各种比较字典序操作相当于求lcp然后比较下一位,全部用二分+哈希实现。

需要倍增维护从下到上,从上到下两条链的哈希值。

想想都麻烦,时间复杂度O(nlognlognlogn)。

786E:codeforces.com/contest/786/problem/E

如果n,m比较小可以直接建图跑最小割了...这里n,m比较大那么可以考虑优化一下建图。

然后题解的方法是倍增的过程把f[i][j]当成一个点,这样每次只会向log个节点连边。

但是我觉得倍增的话对于点的空间是log(n!)≈nlogn的。

这里我直接树剖+线段树维护了,虽然边数极限情况是nlognlogn的,但是点少啊= =

都可以通过此题。

猜你喜欢

转载自www.cnblogs.com/suika/p/9467598.html