[学习笔记]线段树合并
1、[POI2011]ROT-Tree Rotations 分析:线段树合并人生第一题。 网上的题解我都没看懂……我自己讲一下好了 线段树合并就是把两棵权值线段树合并到一棵 那怎么合并呢? 假设有这么两棵树: 一个结点代表一段值域区间有几个数,那么可以看出合并后应该是这样的 然后具体步骤就是找到一个结点,如果一个结点一棵树上有一棵树上没有,那么直 接返回那个结点的编号,否则两个值域的和相加,递归至左儿子和右儿子 每次合并的复杂度为两棵线段树的点数相加 这道题可以算出左儿子的逆序对个数,右儿子的逆序对个数,然后求出 \((x,y)\) 的对数, $x\in $ 左儿子, $y\in $ 右儿子 每次记录一下 \(sum\) ,在每次合并的时候 \(sum[lson[x]]\times sum[rson[y]]\) 和 \(sum[rson[x]]\times sum[lson[y]]\) 中取个最小值算进答案的贡献就可以了(不懂可以自己画图或看代码理解一下) \(Code\ Below:\) #include <bits/stdc++.h> #define ll long long using namespace std; const int maxn=200000+10; int n,L[maxn*24],R[maxn*24],sum[maxn*24],cnt; ll ans