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