hdu 3966 樹鏈剖分 線段樹

2022-09-23 11:54:09 字數 1306 閱讀 2931

題意:給出一棵樹,每個節點有一些敵人,有三種操作,i:x,y,路徑上的所有點的人數+w。d:x,y,路徑上的所有點的人數-w。q:節點x的人數。

思路:如果是線性的線段樹可以做,所以要樹鏈剖分,剖分後的每條鏈是線性的,更改區間時用找公共祖先的方式,將兩點找到同一條鏈上,同一條鏈上的兩點間可以直接線段樹更改。  

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

#include

#include

#include

using namespace std;

const int n=51000;

int son[n],sz[n],dep[n],top[n],father[n],head[n],ti[n],num,idx,a[n];

struct edge

e[n*4];

void addedge(int x,int y)

//*******************樹鏈剖分**********************

void find_son(int u)

} void find_time(int u,int fa)

} //************************線段樹**************************

struct tree

t[n*4];

void buildtree(int l,int r,int id)

void insert(int l,int r,int id,int w)

int mid=(t[id].l+t[id].r)>>1,li=id<<1,ri=li+1;

if(mid>=r)insert(l,r,li,w);

else if(mid>1,li=id<<1,ri=li+1;

if(mid>=i)return find(i,li,w+t[id].ct);

else return find(i,ri,w+t[id].ct);

} void lca(int x,int y,int w)

int main()

father[1]=sz[0]=0;dep[1]=idx=1;

find_son(1);

find_time(1,1);

buildtree(1,n,1);

while(q--)

else

} }

return 0;

}   

hdu 3966(樹鏈剖分 線段樹)

題意 給出一棵樹,每個節點有一些敵人,有三種操作,i x,y,路徑上的所有點的人數 w。d x,y,路徑上的所有點的人數 w。q 節點x的人數。pragma comment linker,stack 1024000000,1024000000 include include include usin...

HDU3966 樹鏈剖分

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

hdu3966 樹鏈剖分

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