数据结构做题笔记

牛客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)\)

猜你喜欢

转载自www.cnblogs.com/Zerokei/p/9661039.html