hdu 3966 樹鏈剖分

2021-09-29 01:43:30 字數 3060 閱讀 7907

樹鏈剖分模板題目,記錄一下。

總結:這裡我re了 幾次,在於update操作中,應該先判斷頭節點的深度,優先跳轉深度淺的,而不是判斷當前兩個點那個更深,這是沒有意義的。

這裡son可以memset成-1,因為dfs的時候會優先賦值不會存在陣列越界。

head陣列也需要複製-1。

其餘陣列在兩次dfs中會被依次賦值,再多組輸入中不用重複清空,會自動覆蓋掉上次結果。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//#include

#include

#define up(i,a,b) for(int i=a;i#define dw(i,a,b) for(int i=a;i>b;i--)

#define upd(i,a,b) for(int i=a;i<=b;i++)

#define dwd(i,a,b) for(int i=a;i>=b;i--)

//#define local

typedef

long

long ll;

const

double esp =

1e-6

;const

double pi =

acos(-

1.0)

;const

int inf =

0x3f3f3f3f

;const

int inf =

1e9;

using

namespace std;

ll read()

while

(ch >=

'0'&& ch <=

'9')

return x * f;

}typedef pair<

int,

int> pir;

#define lson l,mid,root<<1

#define rson mid+1,r,root<<1|1

#define lrt root<<1

#define rrt root<<1|1

const

int n =

1e5+10;

int n, m, p;

int a[n]

;struct node edge[

2* n]

;int head[n]

;int dep[n]

, fa[n]

, siz[n]

, id[n]

, neww[n]

, top[n]

, son[n]

, rk[n]

;ll tree[n <<2]

, lazy[n <<2]

;int cnt =0;

int num =0;

void

addedge

(int u,

int v)

void

pushup

(int root)

void

pushdown

(int root,

int l,

int r)

}void

build

(int l,

int r,

int root)

int mid =

(l + r)

>>1;

build

(lson)

;build

(rson)

;pushup

(root);}

void

update

(int l,

int r,

int root,

int lf,

int rt,

int val)

pushdown

(root, l, r)

;int mid =

(l + r)

>>1;

if(lf <= mid)

update

(lson, lf, rt, val);if

(rt > mid)

update

(rson, lf, rt, val)

;pushup

(root);}

ll querry

(int l,

int r,

int root,

int pos)

pushdown

(root, l, r)

;int mid =

(l + r)

>>1;

ll ans =0;

if(pos <= mid)ans +

=querry

(lson, pos)

;else ans +

=querry

(rson, pos)

;return ans;

}void

dfs1

(int u,

int pre,

int d)

}void

dfs2

(int u,

int tp)}}

void

updaterange

(int x,

int y,

int val)

if(dep[x]

< dep[y]

)swap

(x, y)

;update(1

, n,

1, id[y]

, id[x]

, val);}

ll rgquerry

(int x)

intmain()

else

if(s[0]

=='d'

)else}}

return0;

}

HDU3966 樹鏈剖分

題目 aragorn s story 題意 給一棵樹,並給定各個點權的值,然後有3種操作 i c1 c2 k 把c1與c2的路徑上的所有點權值加上k d c1 c2 k 把c1與c2的路徑上的所有點權值減去k q c 查詢節點編號為c的權值 分析 典型的樹鏈剖分題目,先進行剖分,然後用線段樹去維護即...

hdu3966 樹鏈剖分

近期在強化知識點深度。發現樹鏈剖分不是非常會寫了。回想一下改動操作 若兩個點在同一條鏈上,則直接改動這段區間。若不在同一條鏈上,改動深度較大的點到其鏈頂端的區間,同一時候將這個點變為他所在鏈頂端的父親,迴圈操作直到這兩個點在同一條鏈上。就能夠用上一種方法了。沒實用lca寫是由於曾經被坑過,不但沒有這...

HDU3966 樹鏈剖分

題目 aragorn s story 題意 給一棵樹,並給定各個點權的值,然後有3種操作 i c1 c2 k 把c1與c2的路徑上的所有點權值加上k d c1 c2 k 把c1與c2的路徑上的所有點權值減去k q c 查詢節點編號為c的權值 分析 典型的樹鏈剖分題目,先進行剖分,然後用線段樹去維護即...