樹鏈剖分 複習計畫

2021-10-11 00:14:17 字數 2034 閱讀 3715

應用

一.解題思路:該題需要考慮每條邊給答案帶來的貢獻,通過簡單的畫圖和思考我們可以發現,當乙個節點下有偶數個葉子節點時,該節點到父親節點的邊的貢獻為2,若為奇數則為1,那麼最後的答案為n−2

+sig

ma(d

u[i]

mod2

==0)

n-2+sigma(du[i]mod 2==0)

n−2+si

gma(

du[i

]mod

2==0

),利用樹鏈剖分維護即可

int n, q, rt, sum;

const

int n =

2e5+5;

struct node tr[n<<2]

;vector <

int> edge[n]

;int deg[n]

;int value[n]

;//節點值

int fa[n]

, deep[n]

, son[n]

, siz[n]

;int dfn[n]

,top[n]

, id[n]

, tot =0;

void dfs1 (

int u)}}

void dfs2 (

int u,

int t)

void push_up (

int i)

void push_down (

int i)

}void build (

int i ,

int l ,

int r)

int mid =

(l + r)

>>1;

build (i <<

1, l , mid)

; build (i <<1|

1, mid +

1,r)

; push_up (i);}

void update (

int i ,

int l ,

int r,

int l ,

int r)

push_down

(i);

int mid =

(l + r)

>>1;

if(l <= mid) update (i<<

1,l,mid,l,r);if

(r > mid) update (i<<1|

1,mid+

1,r,l,r)

;push_up

(i);

}void update2 (

int x,

int y)

if(deep[x]

> deep[y]

)swap

(x,y)

;update(1

,1, n, dfn[x]

, dfn[y]);

}int

main

(void

)for

(int i =

1; i <= n ; i ++)if

(deg[i]==1

) value[i]=1

, sum ++

;for

(int i =

1; i <= n ; i ++)if

(sz(edge[i]))

dfs1 (rt)

, dfs2 (rt, rt)

, build (1,

1,n)

; vector <

int> ve;

while

(q --)if

(now %

2) cout <<-1

<< endl;

else cout << n + x -

2+ tr[1]

.v0 << endl;

for(

auto it : ve)

}}

複習計畫 主席樹

三類經典應用 一.區間mex 解題思路 對於主席樹,我們維護一顆權值線段樹,並且用來記錄每乙個數最後出現的位置。為什麼這樣做呢?例如現在有序列 3,1,0,2,3,1,0,2,3,1,0 2,那麼對於主席數來說我們維護 1,4 1,4 1,4 的序列,主席樹內容為 3,2,4,1,0,0 3,2,4...

樹鏈剖分 樹鏈剖分講解

好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 vector v maxn int size maxn dep maxn val maxn id maxn hson maxn top maxn fa maxn 定義 int edge 1,num 1 struct tree e ma...

網路流複習計畫

既然是複習網路流,那就不會去做水題了吧233 a.bzoj3996 tjoi2015線性代數 看到題就被嚇壞了2333。線性代數根本沒看完好嗎?然後。md轉個模型就是網路流了 題目大意 給定乙個n n 的矩陣b 和乙個1 n 的行向量c 求乙個1 n 的01矩陣a 使 a b c at 最大 a b...