省选模拟48

A.长度为n的01串,m次询问区间\([l_i,r_i]\)内结尾的前缀中最大的一对lcs。n m<=1e5

首先翻转串,然后就是喜闻乐见的后缀lcp问题
莫队很好写,用set动态维护下排名序列,由于带log,我只拿了50。
正解考虑sam,答案为[l,r]在树上结点中点对lca的len最大值。
离线询问,对串做扫描线,每次处理i,parent树上编号同前缀编号,那么i点和前面所有点形成的贡献在祖先链上。
对结点按时间染色,当一个结点已经染色为j,就可以更新区间[j,i]的答案,这个可以用bit。
由于对于同样的len,j越大越优,所以用i直接覆盖。
链覆盖,找同种颜色深度最大的(len优)
lct的access完美支持以上操作

B.n个点的树,可以删x条边同时加x条边(要求树形),求每个结点满足到所有结点距离和最小的\(min(x)\)。n<=1e6

必要转化:到所有结点距离和最小的点->重心!
这个可以用调整法证明,假设一条边u-v,v方向点多,那么向v移动增量为负更优。
那么调整到终态,点u不存在sz[v]>n-sz[v]-1,即\(max(sz[v])<\frac{n}{2}\),这就是重心的充要条件。
首先找到原树的重心rt,求出以rt为根的子树的sz,从大到小排序,做前缀和。
分别考虑rt的每个子树中的答案。
那么前缀和*2>=n的除了当前考虑的子树的部分一定是必砍的,因为如果不砍那么重心方向的sz必定不满足。
假设考虑到点u,所有子树方向是一定满足的,因为祖先有重心嗯。
然后可以把所有砍掉的点都直接接到u上,因为都是sz<n/2的子树。
接下来只要保证祖先方向剩下的点<n/2,这个就记录判下就好。
时间复杂度仅为\(O(n)\)

C.给出长度为n排列A,构造一个合法的括号序列满足:\(i\)为左括号时向\(A_i\)连边,最后每个点的为1。n<=100

匹配问题,限制网络流没法做。
对于有排列问题,套路地先\(i-A_i\)连边建下图找性质,最终会形成多个环且无单点。
发现只要确定每个环上一个点的状态,其他可以推知。
这样直接爆搜是\(O(2^{\frac{n}{2}})\)
好像再/2就可以做了,然后发现大小为2的环一定是编号小的为(,大的为)
剩下的直接搜\(O(2^{\frac{n}{4}})\)加点剪枝就做完了。

posted @ 2020-03-17 21:53  hzoi_yzh  阅读(147)  评论(0编辑  收藏  举报