樹鏈剖分模板題目,記錄一下。
總結:這裡我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的權值 分析 典型的樹鏈剖分題目,先進行剖分,然後用線段樹去維護即...