hdu 3966 最純潔的樹鏈剖分

2021-07-05 03:49:04 字數 2218 閱讀 4717

//	hdu 3966 最純潔的樹鏈剖分 

// 題目意思就不多說啦。經典的樹鏈剖分的裸題,看了

// 好久好久,才把樹鏈剖分的基本思想看了一遍,然後

// 自己yy拉好重鏈,寫了個挺醜的線段樹。然後七搞八搞

// 總算是搞出來啦,仔細想來,點還是很簡單的,看著

// 牛人的那篇經典的入門的講解,很奇妙,強烈推薦喲

// 好吧,我等菜鳥繼續加油喲。順帶提一下,此題區間更新

// 單點查詢。

#include #include #include #include #define cls(x,a) memset(x,(a),sizeof(x))

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

using namespace std;

const int maxn = 50000 + 8;

int n,m,p;

int a[maxn];

int num;

int head[maxn];

struct edge

edge(int to,int next):to(to),next(next)

}edges[maxn<<1];

int id;

int dep[maxn]; // 深度

int father[maxn]; // 父節點

int siz[maxn]; // 以該節點為根的子樹節點數目

int son[maxn]; // 重兒子

int top[maxn]; // 鏈頭

int rk[maxn]; // 與idx相反的定義,線段樹中的位置在實際中的節點

void add_edges(int u,int v)

void dfs(int u,int fa,int d)

dfs(v,u,d+1);

siz[u] += siz[v];

if (siz[son[u]] < siz[v])

son[u] = v; }

}void dfs(int u,int tp)

}// 線段樹部分

int seg[maxn<<2];

int laze[maxn<<2];

int ql,qr,delta;

void push_up(int ro)

void push_down(int ro,int m)

}void build(int ro,int l,int r)

int m = (l + r) >> 1;

build(ro<<1,l,m);

build(ro<<1|1,m+1,r);

push_up(ro);

}void update(int ro,int l,int r)

push_down(ro,r-l+1);

int m = (l + r)>>1;

if (ql <= m) update(ro<<1,l,m);

if (m < qr) update(ro<<1|1,m+1,r);

push_up(ro);

}int query(int ro,int l,int r)

push_down(ro,r-l+1);

int m = (l + r) >> 1;

if (ql <= m) return query(ro<<1,l,m);

else return query(ro<<1|1,m+1,r); }

void modify(int u,int v,int k)

ql = idx[p];

qr = idx[u];

delta = k;

update(1,1,n);

u = father[p];

p = top[u];

} if (dep[u] > dep[v])

swap(u,v);

ql = idx[u];

qr = idx[v];

delta = k;

update(1,1,n);

}void input()

dfs(1,0,0);

dfs(1,1);

build(1,1,n);

for (int i=1;i<=p;i++)else if (s[0]=='i')else }}

int main()

return 0;

}

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