2020国家集训队作业选做

板子之类的有在复习,多见点难题,提高下思维姿势水平

[ ] CF504E Misha and LCP on Tree
哈希是具有可加减性的,我们预处理出根到每个节点正反的哈希值,由于怕被卡,要写双哈希。
如何快速求lcp,按照序列上的套路,显然是先二分一个长度,然后check
定完长度后,要求得哈希值,需要用预处理的哈希值差分,这里需要快速查\(k\)级祖先,即\(O(n\log n)-O(1)\)\(k\)级祖先,长链剖分解决
问题在\(O(n+m)\log n\)的时间完成了
这里简要介绍下长链够分求\(k\)级祖先
预处理长链链头上下链长个点,每个点\(2^i\)级祖先
查询时,先跳\(2\)的最高幂次,找到长链头,在于处理上下链长的点的数组中找到答案

[x] CF505E Mr. Kitayuta vs. Bamboos
一个比较巧妙的题,看到最大值最小,应想到二分
check感觉毫无思路,不妨反向思考,所有竹子高度是\(mid\),每次减\(a_i\)的高度,被选中的可以加\(p\)的高度,时时刻刻所有竹子高度必须非负且操作后均大于等于原来的我们考虑维护那些位置先变成负数,优先给这些竹子增加\(p\)高度,用堆维护,还要判下最后状态是否能通过一定的操作,使得所有高度均大于等于原高度
复杂度为\(O(m k \log n \log w)\)\(w\)表示竹子长到的最大高度

[] CF506E Mr. Kitayuta's Gift
最终长度\(n+|s|\)为奇偶差不多,我们先讨论为偶的情况。
考虑不能重复计数,所以我们定义原串s存在的位置是在以回文重心为界限,左右两边尽量向回文串两端匹配的位置,例如\(abba\)\(aabbaa\)的位置是\(1,3,4,6\)
\(f_{i,l,r}\)表示只考虑回文串前\(i\)和后\(i\)个字符,与\(s\)\([l,r]\)还没有找到位置的方案数,\(g_i\)表示只考虑回文串前\(i\)和后\(i\)个字符,\(s\)已经完全匹配的方案数,不难写出转移

  1. \(s_l=s_r,r-l \leq 1\)

\[f_{i,l,r} \rightarrow g_{i+1} \]

\[f_{i,l,r} \times 25 \rightarrow f_{i+1,l,r} \]

  1. \(s_l=s_r,r-l \geq 2\)

\[f_{i,l,r} \rightarrow f_{i+1,l+1,r-1} \]

\[f_{i,l,r} \times 25 \rightarrow f_{i+1,l,r} \]

  1. \(s_l \neq s_r\)

\[f_{i,l,r} \rightarrow f_{i+1,l+1,r} \]

\[f_{i,l,r} \rightarrow f_{i+1,l,r-1} \]

\[f_{i,l,r} \times 24\rightarrow f_{i+1,l,r} \]

  1. g的转移

\[g_i \times 26 \rightarrow g_{i+1} \]

发现这个东西可以矩阵快速幂加速,但是并没有什么作用。发现转移这是个dag,就当是个自动机,考虑如何优化节点数
发现自动机节点只分两种。设红点表示两端不匹配的点,绿点表示两端匹配的点(包含\(l=r\))。通过转移观察,发现红点转移一样,绿点转移也一样,和顺序无关。设红点数为\(r\),绿点数为\(g\),对于一条路径,一定满足\(g=\left\lceil\frac{|s|-r}{2}\right\rceil\)。红点数增加时绿点减少,那么实际就可以前后缀和优化建图的思想建出点数为\(|s|\)级别的自动机,矩阵快速幂即可。注意我们不考虑顺序需要乘个贡献的,在红点连绿点时乘上。考虑这个贡献的求法,设\(h_{i,l,r}\)表示选了\(i\)个红点,\([l,r]\)未匹配的方案数,记忆化搜索求解
奇数的情况还要减去不合法的(两个字符的绿点转移到\(g\))
我们得到了\(O(|s|^3 \log n)\)的做法,似乎有点卡常

[x] CF512D Fox And Travelling
显然环上的点是无法删除的,剩下只剩一些有根树(跟是接着环的节点)和无根树
分别求解每个树的答案,最后合并背包,乘上组合数即可
1.有根树
\(f_{i,j}\)表示\(i\)子树选了\(j\)个的方案数,不同子树合并也要乘上组合数
2.无根树
每个点钦定为跟做一次有根树的做法,大小为\(k\)的会被统计\(n-k\)次,乘个逆元即可
做法复杂度为\(O(n^3)\)

posted @ 2020-11-23 21:07  JSOI爆零珂学家yzhang  阅读(531)  评论(0编辑  收藏  举报