首页 > 其他 > 详细

省选模拟48

时间:2020-03-17 22:30:07      阅读:52      评论:0      收藏:0      [点我收藏+]

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}})\)加点剪枝就做完了。

省选模拟48

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!