省选模拟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}}))加点剪枝就做完了。

原文地址:https://www.cnblogs.com/hzoi-yzh/p/12513773.html