HDU3966 樹鏈剖分(點權)入門 鏈分治

2021-06-26 01:51:56 字數 1340 閱讀 2122

本人的第二道樹鏈剖分。

題意:n個結點的樹,每個結點有個權值,3個操作:1、增加u到v的路徑上所有結點的權值;2、減少u到v的路徑上所有結點的權值;3、查詢某個結點的權值

**如下:

#pragma comment(linker,"/stack:100000000,100000000")

#include#include#include#include#include#include#include#define n 50005

#define inf 0x3f3f3f3f

#define pi acos(-1.0)

#define eps 10e-6

using namespace std;

int a[n];

vectorg[n];

int son[n],fa[n],dep[n],siz[n];

void dfs1(int u,int pa,int depth)

}void dfs2(int u,int pa)

}struct nodetree[n<<2];

void build(int o,int l,int r)

int m = (l+r)/2;

build(2*o,l,m);

build(2*o+1,m+1,r);

}void output(int o)

void change(int x,int y,int v)

update(1,w[f1], w[x],v);//xiu gai

x = fa[f1];

f1 = top[x];

}update(1,min(w[x],w[y]), max(w[x],w[y]),v);

if(x == y) return ;

}int query(int o,int pos,int add)

int main()

for(i = 1; i <= n; i++) scanf("%d",&a[i]);

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

dfs1(1,1,1);

dfs_clock = 0;

dfs2(1,1);

for(i = 1; i <= n; i++)

b[ w[i] ] = i;

build(1,1,n);

//output(1);

while(p--)

else}}

return 0;}/*

7 6 10

1 2 3 4 5 6 7

1 21 3

2 42 5

5 65 7

*/

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的權值 分析 典型的樹鏈剖分題目,先進行剖分,然後用線段樹去維護即...