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