BZOJ2212 二叉樹 線段樹合併

2021-08-22 11:44:36 字數 604 閱讀 6692

這道題給人的第一感覺像是樹形

#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];//原二叉樹的資料

int cnt,ls[maxn<<4],rs[maxn<<4],num[maxn<<4];//權值線段樹的資料

long long ans,numl,numr;

int read()

void input(reg int x)//按照題目要求,遞迴讀入每個非葉子結點的左右兒子

}int add(reg int x,reg int l,reg int r,reg int v)//動態開點

return x;

}int merge(reg int x,reg int y)//合併子樹並更新答案

void work(reg int x)//在原二叉樹上遞迴

int main()

這裡講一

bzoj 2212(線段樹合併)

傳送門 題解 權值線段樹從下往上合併,每個點統計兩個兒子中某乙個交換 不交換的答案,取min後加到總答案中。不禁讓人想起cdqz challenge 13 p.s.形態樹開兩倍空間,因為這種讀入方式肯定會讀成一棵滿二叉樹 不管存不存在子節點先加了時間戳 另外,定義變數要搞清楚哪個是輸入的形態樹,哪個...

bzoj2212(線段樹合併)

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

bzoj3702 二叉樹 線段樹

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