【总结】线段树合并杂题

bzoj1483: [HNOI2009]梦幻布丁

每个颜色建一颗线段树,改色就是暴力合并两个颜色的线段树,维护连续区间个数即可。

p.s 也可以链表合并做


2212: [Poi2011]Tree Rotations

从叶子节点向上,计算 s w a p ( l c h i l d , r c h i l d ) swap(lchild,rchild) swap(lchild,rchild)后的逆序对个数和原来的逆序对个数,贪心换/不换。

计算逆序对个数可以线段树以权值为下标处理

p.s 也可以 s p l a y splay splay O ( n log ⁡ 2 n ) O(n\log ^2 n) O(nlog2n)


BestCoder Round #52 (div.1) 3.Victor and Proposition

建图连边求SCC,设第 i i i个SCC大小为为 c n t i cnt_i cnti a n s = ∑ ( c n t i 2 ) ans=\sum{cnt_i\choose 2} ans=(2cnti)

问题似乎是深度差不超过 d i d_i di而不是标号(其实也没什么区别,下面就按深度来)

线段树优化连边:
对于每个点的子树维护以深度为下标的线段树, i i i x i x_i xi的线段树 [ d e p [ x i ] , d e p [ x i ] + d i ] [dep[x_i],dep[x_i]+d_i] [dep[xi],dep[xi]+di]连边。

至于每个点的线段树:可以对叶子结点都建立一颗,每次线段树合并上去即可。


SPOJ COT6

没有找到原题…

题意:
称有根树的一条路径为直链当且仅当路径上任意两点都存在祖孙关系。
现在给定一颗顶点带权的有根树,要求把它划分成若干直链,使得每条直链的权和的平方和最小。
每个顶点的权都是整数,保证任意直链的权和都在 i n t int int范围内,答案不超过 1 e 16 1e16 1e16

口胡题解(???):

记录每个点到根的点权和 w i w_i wi

考虑选出根到结点 x x x的直链后将树划分成了若干森林(根到 x x x的路径上的若干兄弟结点子树& x x x的所有儿子结点子树),故设 d p [ i ] dp[i] dp[i]表示 i i i子树的最优值, s u m [ i ] = ∑ j ∈ s o n i d p j sum[i]=\sum\limits_{j\in son_i}dp_j sum[i]=jsonidpj g [ i ] [ j ] g[i][j] g[i][j]表示 i i i子树中去掉 i → j i\to j ij路径的点后的森林的最优值。

为方便表示,设 b e l x bel_x belx表示当 i i i为根时,结点 x x x b e l x bel_x belx的子树内( b e l x bel_x belx i i i的儿子结点)。

转移:
g [ i ] [ x ] = g [ b e l x ] [ x ] + s u m [ i ] − d p [ b e l x ] g[i][x]=g[bel_x][x]+sum[i]-dp[bel_x] g[i][x]=g[belx][x]+sum[i]dp[belx]
d p [ i ] = m i n ( g [ i ] [ x ] + ( w x − w f a i ) 2 ) dp[i]=min(g[i][x]+(w_x-w_{fa_i})^2) dp[i]=min(g[i][x]+(wxwfai)2)

拆分系数: d p [ i ] = w f a i 2 + m i n ( − 2 w f a i w x + g [ i ] [ x ] + w x 2 ) dp[i]=w_{fa_i}^2+min(-2w_{fa_i}w_x+g[i][x]+w_x^2) dp[i]=wfai2+min(2wfaiwx+g[i][x]+wx2)

考虑对于所有 x x x,表示成平面上 ( w x , g [ i ] [ x ] + w x 2 ) (w_x,g[i][x]+w_x^2) (wx,g[i][x]+wx2)的点,维护下凸壳,斜率为 2 w f a i 2w_{fa_i} 2wfai的直线与下凸壳切线的截距就是 d p i dp_i dpi

于是问题转化成了对于每个点维护一些点的下凸壳,每次将所有点整体向上平移一定距离,并与兄弟结点的凸壳合并。

B S T BST BST启发式合并可以 O ( n log ⁡ 2 n ) O(n\log ^2n) O(nlog2n)处理。

但这里探讨一下线段树合并的做法:

线段树下标为离散化后 x x x坐标。

同一个位置的合并对 y y y min ⁡ \min min即可,而对于两段x轴上射影不相交的下凸壳( ( l , m i d ) & ( m i d + 1 , r ) (l,mid)\& (mid+1,r) (l,mid)&(mid+1,r)),维护叶子结点的双向链表和相邻点的向量,线段树每个结点记录范围内凸壳上最左和最右的点,合并中间即可。

复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)


SPOJ COT7

同找不到原题…

题意:
有根树每个点有两个权c和w,仍然是直链划分,最小化w和的最小平方和。
划分出的直链c的和必须在给定范围[L,R]内。
保证任意直链的c和与w和都是int范围内的整数

口胡题解(???):

比6多了一维的限制。
同样维护点到根的 c c c的和 t i t_i ti
大概是把 t i t_i ti离散化之后在线段树上多套一维吧。。。
咕咕咕


SPOJ AE5A2

S A M SAM SAM+线段树合并把每个结点的 r i g h t right right集合求出来。

节点 i i i的线段树中维护相邻两个出现位置之间的最大值 d i s i dis_i disi(线段树节点维护最左最右点),贡献为 m a x ( 0 , m x i − d i s i + 1 ) max(0,mx_i-dis_i+1) max(0,mxidisi+1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值