Day2
lct维护子树信息
对于每个点记录所有轻儿子信息和。把 \(u\) 转成根后,\(u\) 所在重链就是平衡树上右子树了。在 access 中 \(ch(x,1)=y\) 的时候 \(O(1)\) 修改即可。
P8265 [Ynoi Easy Round 2020] TEST_63
把所有的轻边变成重边(access)
枚举 \(k\) 找到 \(sz_u \ge 2^k > sz_{son}\)(splay上二分),因为 \(sz_u > 2 sz_{son}\)
修改(维护轻儿子信息)
ふたつのアンテナ (Two Antennas)
扫描线,扫 \(j\),维护 \(i\) 答案。
对于 \(i\),在 \(i+a_i\) 标记为可用,在 \(i+b_i+1\) 标记为不可用。
然后对于每个 \(j\) 在 \([j-r_j,j-l_j]\) 中的 \(i\) 为可能决策集合。
线段树可解决。
P9061 [Ynoi2002] Optimal Ordered Problem Solver
区间赋值之后,我们发现形成了轮廓线。
查询是三维偏序,\((x,y,t)\),但是这是 \(2\log\) 的。考虑优化一下,可以用容斥。
区域 \(1\) 和 \(3\) 都是 \(x/y\) 维 \(+ t\),\(2\) 因为没有被修改过,所以不用考虑 \(t\),直接 \(x,y\)。都是二维偏序,时间复杂度 \(O(n\log n)\)。
P8987 [北大集训 2021] 简单数据结构
如果询问是在最后的话,可以考虑把所有 \(\min\) 操作移到最后。
考虑先 \(\min v\) 再 \(+i\),调换一下顺序就是先 \(+i\),再取 \(\min v+i\),最后就是若干个 \(\min v+k\times i\),然后发现这个搞出来就是一个凸包。
对于每个点被操作的时间可以整体二分,对于左侧求凸包,如果在左侧就放到左边,否则放到右边。
Top Cluster
给定一颗带点权的树,所有权值互不相同。多次查询距离一个点距离 \(\le d\) 的点的权值 \(\operatorname{mex}\)。\(n,q\le 2\times 10^5\)。
我们可以二分答案,找到所有权值 \(\le mid\) 的点是否有点距离 \(>d\)。我们对于每个数 \(i\) 求 \([0,i]\) 对应的直径。
gym103861 C
dmopc21c8p6
\(n\) 在当前序列最大值左边或者右边,枚举一下,然后每个位置就有一个取值区间。这是一个匹配问题,可以用 Hall 定理解决。
P10145 [WC2024] 线段树
对于区间 \([l,r)\) 我们在 \(l\) 和 \(r\) 之间连一条边,最后能表示出 \([L,R)\) 就是 \(L\) 和 \(R\) 联通。等价于去问,有多少边集使得给出的 \(m\) 对点联通。
如果左右联通,\(x\) 和外面的 \(y\) 联通,那么
如果左右不连通,存在一个分界线使得左边和左边联通,右边
设 \(dp_{u,i}\) 表示 \(u\) 节点线段树位置为 \(i\),\(f_u\) 表示联通情况。这是 \(O(n^2)\),如果用线段树合并可以是 \(O(n\log n)\)。
P6109 [Ynoi2009] rprmq1
考虑线段树分治,每一层都从左往右扫,对于加法操作,左加右减就行了。每次在询问右端点查询区间历史最大值,为了防止在不受到前面的影响,我们可以在进入左端点前给后面加上 \(\infty\),最后在减去即可。
时间复杂度 \(O(m\log^2n+q\log n)\)
QOJ8240. Card Game
设 \(t_i\) 为 \(i\) 后面第 \(1\) 次出现 \(a_i\) 的位置。
假设现在 \(solve(l,r)\),如果 \(t_l>r\),那么 \(solve(l,r)=solve(l+1,r)+1\),如果 \(t_l\le r\),那么 \(solve(l,r)=solve(t_l+1,r)\)。我们对于所有 \(l\) 维护一下答案,可持久化线段树从上一个版本复制即可。
QOJ7884
我们发现划分联通块只有最大值和次大值才有贡献。这是一条链。
于是就是选若干条链,每条链产生的贡献是两个端点取 \(\min\)。
设 \(f_{i,j}\) 表示以 \(i\) 为根的子树中,选择向上连接的
线段树合并维护 dp。
A. 택시 여행
给定一颗 \(n\) 个节点的树,从 \(u\) 一步走到 \(v\) 的权值为 \(a_u\times dis(u,v)+b_u\)。求从 \(1\) 走到其他所有点所需的最小权值和。\(n\le 10^5\)。
最短路考虑 Dij,但是不能直接做。
可以点分治一下,如果经过 \(rt\),从 \(u\) 到 \(v\) 的代价就是 \(a_u\times d_v+(a_ud_u+b_u)\)。可是我们同时还要考虑同一子树内,有多个分治中心。于是可以用点分树,对于每一个点插入一个一次函数,每个点找到最小 \(d_v\),不断增广删点。
P8990 [北大集训 2021] 小明的树
trick: 联通块个数是 \(\lvert V\rvert-\lvert E\rvert\)。
题目要求等价于:未点亮部分不存在点亮的祖先,所以新的一个点被点亮后如果满足要求,那么未点亮部分为一个联通块,点亮部分联通块个数是 点-边。所以总体贡献就是 \(\sum\limits_{i=1}^{n-1}[未点亮的点-边=1](点亮的点-边)\)。
我们可以维护时刻 \(i\) 未点亮联通块的个数设为 \(c_i\),初始 \(n-1\) 条边未被点亮,时刻 \(i\) 后有 \(n-i\) 个未点亮,所以我们可以初始化 \(c_i=1-i\)。每条边都有一个被修改的时间也就是两个端点最被先点亮的时间 \(t\) ,然后对于 \(c_t...c_{n-1}\) 区间 \(+1\) 即可。
对于点亮的部分同理维护即可。初始有 \(0\) 条边被点亮,时刻 \(i\) 后有 \(i\) 个点被点亮,所以初始化 \(v_i=i\),记两个端点最晚被点亮的时候为 \(t\),对于 \(c_t...c_n\) 区间 \(-1\)。
如果在 \(c_i=1\) 的时候,统计答案呢?发现 \(c_i\) 的最小值就是 \(1\),于是我们只要维护区间 \(c\) 最小值,并且记录下对应 \(\sum v\)
QOJ5017. 相等树链
看到路径统计问题考虑点分治。
CF1558F Strange Sort
我们对于每个 \(x\in [1,n]\),设 \(\le x\) 的为 \(0\),\(>x\) 的为 \(1\)。我们得到了一个 01 序列,对这个序列进行题目中的排序,这个时间就是最后 \(x\) 复位的时间我们对于所以 \(x\in[1,n]\),得到的答案取 \(\max\) 就是答案了。
对于某个 01 序列,我们设有 \(m\) 个 \(1\) 点,位置是 \(x_i\),到达时间为 \(t_i\)。\(t_m=n-x_m+0/1\),然后对于 \(\forall i<m\),\(t_i=\max(n-x_i+0/1,t_{i+1}+1)\)。以此类推即可。
我们要对所有 \(x\) 求,也就是单点修改一下就行了。
QOJ4815. Flower's Land
点分治找到重心后,只算包含重心的联通块。可以按照 dfs 序进行 DP 来找联通块。可以设 \(f_{u,i}\) 表示走到了 \(u\),当前联通块大小为 \(i\) 的最大权值。这样就能求出来包含根的最大权值。我们考虑把儿子顺序反过来,再做一遍 DP,然后每个节点处前后拼接一下。时间复杂度 \(O(nk\log{\frac{n}{k}})\)。
Segbeats
有两种操作
- 区间 chkmin
- 区间和
还是线段树,维护区间最大值,严格次大值,个数,区间和。
如果 \(c>max1\),就直接返回。
如果 \(max1>c>max2\),等同于把所有最大值变为 \(c\),\(sum+=num(c-max1)\)
如果 \(c\le max2\),暴力递归。
可以有单点修改,如果有区间加,是 \(2\log\)。
常数很大。