bzoj3702 二叉樹 權值線段樹

2021-07-11 17:54:11 字數 942 閱讀 6279

神奇的解法

對於每個節點,建出權值線段樹

每次查詢右子樹的權值線段樹和左子樹的權值線段樹,左子樹中比右子樹小的有多少?右子樹比左子樹小的有多少?(分別對應不交換的逆序對和交換的逆序對)

將左子樹和右子樹的權值線段樹合併

遞迴進行這個操作

感覺複雜度很不靠譜,於是想證明一下複雜度

最開始權值線段樹共o(nlogn)個節點,最後共o(n)個節點

每次合併兩棵樹的每個節點都要訪問一遍,所以每個節點好像是要訪問o(dep[i])次?

但是,合併兩棵樹後,有些重複的節點被合併到了一起

所以好像有些節點又沒有合併o(dep[i])次?

感覺很靠譜,但是不會證明

#include#include#include#include#include#include#define maxn 400010

#define n 4000100

using namespace std;

int lch[n],rch[n],sum[n];

int root[maxn],l[maxn],r[maxn],w[maxn];

int n,m,num,tot;

long long ans,cnt1,cnt2;

void dfs(int x)

}void update(int x)

void modify(int &x,int l,int r,int d)

int mid=(l+r)/2;

if (d<=mid) modify(lch[x],l,mid,d);

else modify(rch[x],mid+1,r,d);

update(x);

}int merge(int x,int y)

void dfs1(int x)

}int main()

bzoj3702 二叉樹 線段樹

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

bzoj 3702 二叉樹 (線段樹)

time limit 15 sec memory limit 256 mb submit 428 solved 184 submit status discuss 現在有一棵二叉樹,所有非葉子節點都有兩個孩子。在每個葉子節點上有乙個權值 有n個葉子節點,滿足這些權值為1.n的乙個排列 可以任意交換每...

完全二叉樹的權值

給定一棵包含n 個節點的完全二叉樹,樹上每個節點都有乙個權值,按從上到下 從左到右的順序依次是a1,a2,an 現在要把相同深度的節點的權值加在一起,想知道哪個深度的節點權值之和最大?如果有多個深度的權值和同為最大,請你輸出其中最小的深度。注 根的深度是1。輸入格式 第一行包含乙個整數n。第二行包含...