hdu3966 樹鏈剖分

2021-09-07 11:34:47 字數 1097 閱讀 6802

近期在強化知識點深度。發現樹鏈剖分不是非常會寫了。

回想一下改動操作:

若兩個點在同一條鏈上,則直接改動這段區間。

若不在同一條鏈上,改動深度較大的點到其鏈頂端的區間,同一時候將這個點變為他所在鏈頂端的父親,迴圈操作直到這兩個點在同一條鏈上。就能夠用上一種方法了。

沒實用lca寫是由於曾經被坑過,不但沒有這樣的方法好寫。效率也不太讓人愜意。

主要是對另外一種情況怎樣寫有所遺忘。寫道模版再給自己提個醒。

#include#include#include#include#include#include#include#includeusing namespace std;

#define maxn 50005

int n,m,q;

vectormap[maxn];

int size[maxn],fa[maxn],son[maxn],val[maxn],tid[maxn],_tid[maxn],dep[maxn],top[maxn];

int cnt;

struct node

tree[maxn<<2];

void dfs1(int s,int f,int d)

void down(int now)

void update(int l,int r,int now,int num)

if(tree[now].val)

down(now);

int mid=(tree[now].l+tree[now].r)>>1;

if(r<=mid)

update(l,r,now<<1,num);

else if(l>mid)

update(l,r,now<<1|1,num);

else

}void change(int s,int e,int num)

int query(int l,int now)

int main()

for(int i=1;idfs1(1,-1,1);

dfs2(1,1);

build(1,n,1);

while(q--)

else}}

}

HDU3966 樹鏈剖分

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

HDU3966 樹鏈剖分

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

HDU 3966(樹鏈剖分)

給你乙個有n nn個頂點的樹,樹上的每乙個點都有乙個點權,現在有3 33種操作 樹鏈剖分的模板題。倘若只有操作1 11和操作2 22,則我們只需要用樹上差分用o n m mathcal n m o n m 的時間複雜度完成操作。但是,現在這個問題中,因此操作3 33的存在,使得用樹上差分去做的話時間...