最近在強化知識點深度,發現樹鏈剖分不是很會寫了。
回顧一下修改操作:
若兩個點在同一條鏈上,則直接修改這段區間。
若不在同一條鏈上,修改深度較大的點到其鏈頂端的區間,同時將這個點變為他所在鏈頂端的父親,迴圈操作直到這兩個點在同一條鏈上,就可以用上一種方法了。
沒有用lca寫是因為以前被坑過,不但沒有這種方法好寫,效率也不太讓人滿意。
主要是對第二種情況如何寫有所遺忘,寫道模版再給自己提個醒。
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define maxn 50005
int n,m,q;
vector map[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;i
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的權值 分析 典型的樹鏈剖分題目,先進行剖分,然後用線段樹去維護即...