牛客NOIP模拟第一场T3
Description
给一棵树,给定m条树上的路径.
每次询问x,k.
表示从x到根节点的路径上的某个点y,x到y的路径必须被至少k条路径完全覆盖.
求深度最浅的y.
- \(n,m,q\leq 200000\)
Solution
主席树
- 可以发现对于y有一种单调性,每次二分一个深度,然后就化成了一个判定性问题.
- 已知一条关于(x,y)的路径,求给定的路径有几条包含它.
- 设x属于以s为根的y的子树中.
- 那么就要数一端落在(Lt[x],Rt[x]),一端落在(1,Lt[s]-1)U(Rt[s]+1,n)的路径有几条.
- 这是一个经典的二维数点问题.
- 用主席树差分一下,复杂度logn.
- 加上外面的二分,复杂度\(O(nlog^2{n})\).
线段树合并
- 树上路径还有很多性质,比如可拆分性,就是说把一条路径根据LCA剖成两半.
- 发现一条不弯折路径要包含一个点(x),一端要在x的子树内,一端要在x到根节点的路径上.
- 那么对于询问,只用查询子树上所有点,连到自己上方点的路径情况,做一个类似于区间第K值的线段树内二分即可.
- 子树信息可以用线段树合并完成.
- 复杂度\(O(nlogn)\)
YCJS 3916 三角形
Desciption
给定一个序列,有两种操作.
op1:改变某个点的权值
op2:询问[l,r]的点集中选取三个点,要求它们的大小关系满足三角形三边关系,同时要求总长尽量大.
\(Ai\leq 1e9,n\leq 1e5\)
Solution
有限关系+归并树
- 首先,如果序列有序,那么就只用把点排序,然后扫描一遍相邻三个是否合法即可.
- 使每一层序列有序,可以利用归并树解决
- 但是每一层归并树的节点数量太多了,需要进行优化.
- 考虑记录最大的几个点.
- 如果\(a_i>=a_{i-1}+a_{i-2}\),那么\(a_i\)不会有效.
- 但发现这样的不等式满足斐波那契数列,所以最多连续出现\(logV\)次,那么只用记录\(logV+2\)的最大的点就一定存在答案.
- 所以总复杂度\(O(nlogn*45)\)