bzoj 2212(線段樹合併)

2021-08-08 22:22:41 字數 799 閱讀 7969

傳送門

題解:權值線段樹從下往上合併,每個點統計兩個兒子中某乙個交換/不交換的答案,取min後加到總答案中。不禁讓人想起cdqz challenge 13

p.s.形態樹開兩倍空間,因為這種讀入方式肯定會讀成一棵滿二叉樹(不管存不存在子節點先加了時間戳)。另外,定義變數要搞清楚哪個是輸入的形態樹,哪個是線段樹。

#include

using namespace std;

typedef long long ll;

const int maxn=2e5+4;

int st,n,a[maxn<<1],son[2][maxn<<1],tim=0,tot=0;

int root[maxn<<1],lc[maxn*19],rc[maxn*19],siz[maxn*19];

ll t1,t2,ans=0;

inline int

read()

void init(int &x)

inline void pushup(int rt)

void insert(int &rt,int l,int r,int val)

int mid=(l+r)>>1;

if (val<=mid) insert(lc[rt],l,mid,val);

else insert(rc[rt],mid+1,r,val);

pushup(rt);

}int merge(int

x,int

y) void work(int

x) int main()

bzoj2212(線段樹合併)

description 現在有一棵二叉樹,所有非葉子節點都有兩個孩子。在每個葉子節點上有乙個權值 有n個葉子節點,滿足這些權值為1 n的乙個排列 可以任意交換每個非葉子節點的左右孩子。要求進行一系列交換,使得最終所有葉子節點的權值按照遍歷序寫出來,逆序對個數最少。input 第一行n 下面每行,乙個...

BZOJ2212 二叉樹 線段樹合併

這道題給人的第一感覺像是樹形 include define maxn 400010 define reg register define cmin x,y x y using namespace std int n,tot,w maxn lson maxn rson maxn root maxn 原...

BZOJ 4756 線段樹合併(線段樹)

思路 1.最裸的線段樹合併 2.我們可以觀察到子樹求乙個東西 那我們直接dfs序好了 入隊的時候統計一下有多少比他大的 出的時候統計一下 減一下 搞定 線段樹合併 by siriusren include include include using namespace std const int n...