樹鏈剖分學習 HDOJ 3966

2021-06-26 17:20:16 字數 2312 閱讀 4627

概念入門看看這個就有點明白了

之後看了幾段bin神的**

hdoj5044 (

樹鏈剖分+卡常數)

add1 u v w u-v路徑上的點權加w

add2 u v w u-v路徑上的邊權加w

輸出點邊權

hdoj5029(樹鏈剖分+zkw線段樹)

u v id u-v路徑上的點新增id

輸出點上最多的id

poj 3237(

樹鏈剖分+zkw線段樹

)change i v 第i條邊權置為v

negate a b u-v路徑上的邊權*-1

query a b 輸出u-v路徑上的邊權最大值

然後再找了一題練習下

hdoj 3966

i       c1 c2 k    c1-c2路徑上的點權加k

d     c1 c2 k    c1

-c2路徑上的邊權減k

q     c             查詢c的點權

這題用樹鏈剖分+樹狀陣列會更好...

不過由於前面看的**都是樹鏈剖分+zkw線段樹

所以我也直接用樹鏈剖分+zkw線段樹解題

#include #include #include #pragma comment(linker, "/stack:36777216")

using namespace std;

const int maxn = 100010;

struct edgeedge[maxn<<2];

int head[maxn],tot;

int top[maxn];//top[v]表示v所在的重鏈的頂端節點

int fa[maxn]; //父親節點

int deep[maxn];//深度棧

int num[maxn];//num[v]表示以v為根的子樹的節點數

int fp[maxn];//和p陣列相反

int son[maxn];//重兒子

int pos;

void init()

void addedge(int u,int v)

void dfs1(int u,int pre,int d)

}}void getpos(int u,int sp)

}//線段樹

struct node

}segtree[maxn<<2];

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);

}void update(int i,int k,int val)

int mid = (segtree[i].l+segtree[i].r)/2;

if(k <= mid)update(i<<1,k,val);//二分k

else update((i<<1)|1,k,val);

}void w_update(int i,int l,int r,int val)//把線段樹l-r的節點的值都加val

int mid = (segtree[i].l + segtree[i].r)/2;

if(r <= mid)w_update(i<<1,l,r,val);

else if(l > mid) w_update((i<<1)|1,l,r,val);

else

}void add(int u,int v,int w)//把u-v路徑上的邊的值都加w

w_update(1,p[f1],p[u],w);

u = fa[f1]; f1 = top[u];

}if(deep[u] > deep[v]) swap(u,v);

return w_update(1,p[u],p[v],w);

}int query(int i,int l,int r,int add) //查詢到點路徑上add相加值

template inline bool read(t &ret)

int e[maxn][3];

int main()

for(int i = 0;i < m;i++)

dfs1(1,0,0);

getpos(1,1);

build(1,0,pos-1);//建樹後在update新增權值

for(int i = 0;i < n; i++)

while(pp--)

{char op[10];

int u,v,w;

//op[0]=getchar();

scanf("%s",op);

//cout<

HDU 3966 樹鏈剖分學習

這道題不難,看出是樹鏈剖分就很簡單,其實奇異也很明顯就是乙個樹鏈剖分,不過這次不是把樹鏈扔到線段樹上,是把節點扔到線段樹上。這個時候注意一下w 1 1就行了,其他就是線段樹的乙個區間覆蓋的問題了。include include include include include include defi...

HDU3966 樹鏈剖分

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

hdu3966 樹鏈剖分

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