bzoj 3702 二叉樹 (線段樹)

2021-07-25 14:59:15 字數 1193 閱讀 4893

time limit: 15 sec  

memory limit: 256 mb

submit: 428  

solved: 184 [

submit][

status][

discuss]

現在有一棵二叉樹,所有非葉子節點都有兩個孩子。在每個葉子節點上有乙個權值(有n個葉子節點,滿足這些權值為1..n的乙個排列)。可以任意交換每個非葉子節點的左右孩子。

要求進行一系列交換,使得最終所有葉子節點的權值按照中序遍歷寫出來,逆序對個數最少。

第一行n

下面每行,乙個數x

如果x==0,表示這個節點非葉子節點,遞迴地向下讀入其左孩子和右孩子的資訊,

如果x!=0,表示這個節點是葉子節點,權值為x。

一行,最少逆序對個數。 3

0031

21對於100%的資料:2<=n<=200000。

[submit][

status][

discuss]

題解:同bzoj 2212

#include#include#include#include#define n 400003

#define ll long long

using namespace std;

int n,m,val[n],rt,ls[n*20],rs[n*20],tot;

int l[n],r[n],maxn,num[n],cnt,in[n],out[n],q[n],sz,root[n];

ll sl,sr,sum[n*20];

int dfs()

in[now]=sz+1;

l[now]=dfs(); r[now]=dfs();

out[now]=sz;

return now;

}void update(int x)

void insert(int &i,int l,int r,int x)

int mid=(l+r)/2;

if (x<=mid) insert(ls[i],l,mid,x);

else insert(rs[i],mid+1,r,x);

update(i);

}int merge(int x,int y)

ll solve(int x)

int main()

bzoj3702 二叉樹 線段樹

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

bzoj3702 二叉樹 權值線段樹

神奇的解法 對於每個節點,建出權值線段樹 每次查詢右子樹的權值線段樹和左子樹的權值線段樹,左子樹中比右子樹小的有多少?右子樹比左子樹小的有多少?分別對應不交換的逆序對和交換的逆序對 將左子樹和右子樹的權值線段樹合併 遞迴進行這個操作 感覺複雜度很不靠譜,於是想證明一下複雜度 最開始權值線段樹共o 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 原...