概念入門看看這個就有點明白了
之後看了幾段bin神的**
hdoj5044 (
樹鏈剖分+卡常數)
add1 u v w u-v路徑上的點權加w
add2 u v w u-v路徑上的邊權加w
輸出點邊權
hdoj5029(樹鏈剖分+zkw線段樹)
u v id u-v路徑上的點新增id
輸出點上最多的id
poj 3237(
樹鏈剖分+zkw線段樹
)change i v 第i條邊權置為v
negate a b u-v路徑上的邊權*-1
query a b 輸出u-v路徑上的邊權最大值
然後再找了一題練習下
hdoj 3966
i c1 c2 k c1-c2路徑上的點權加k
d c1 c2 k c1
-c2路徑上的邊權減k
q c 查詢c的點權
這題用樹鏈剖分+樹狀陣列會更好...
不過由於前面看的**都是樹鏈剖分+zkw線段樹
所以我也直接用樹鏈剖分+zkw線段樹解題
#include #include #include #pragma comment(linker, "/stack:36777216")
using namespace std;
const int maxn = 100010;
struct edgeedge[maxn<<2];
int head[maxn],tot;
int top[maxn];//top[v]表示v所在的重鏈的頂端節點
int fa[maxn]; //父親節點
int deep[maxn];//深度棧
int num[maxn];//num[v]表示以v為根的子樹的節點數
int fp[maxn];//和p陣列相反
int son[maxn];//重兒子
int pos;
void init()
void addedge(int u,int v)
void dfs1(int u,int pre,int d)
}}void getpos(int u,int sp)
}//線段樹
struct node
}segtree[maxn<<2];
void build(int i,int l,int r)
int mid = (l+r)>>1;
build(i<<1,l,mid);
build((i<<1)|1,mid+1,r);
}void update(int i,int k,int val)
int mid = (segtree[i].l+segtree[i].r)/2;
if(k <= mid)update(i<<1,k,val);//二分k
else update((i<<1)|1,k,val);
}void w_update(int i,int l,int r,int val)//把線段樹l-r的節點的值都加val
int mid = (segtree[i].l + segtree[i].r)/2;
if(r <= mid)w_update(i<<1,l,r,val);
else if(l > mid) w_update((i<<1)|1,l,r,val);
else
}void add(int u,int v,int w)//把u-v路徑上的邊的值都加w
w_update(1,p[f1],p[u],w);
u = fa[f1]; f1 = top[u];
}if(deep[u] > deep[v]) swap(u,v);
return w_update(1,p[u],p[v],w);
}int query(int i,int l,int r,int add) //查詢到點路徑上add相加值
template inline bool read(t &ret)
int e[maxn][3];
int main()
for(int i = 0;i < m;i++)
dfs1(1,0,0);
getpos(1,1);
build(1,0,pos-1);//建樹後在update新增權值
for(int i = 0;i < n; i++)
while(pp--)
{char op[10];
int u,v,w;
//op[0]=getchar();
scanf("%s",op);
//cout<
HDU 3966 樹鏈剖分學習
這道題不難,看出是樹鏈剖分就很簡單,其實奇異也很明顯就是乙個樹鏈剖分,不過這次不是把樹鏈扔到線段樹上,是把節點扔到線段樹上。這個時候注意一下w 1 1就行了,其他就是線段樹的乙個區間覆蓋的問題了。include include include include include include defi...
HDU3966 樹鏈剖分
題目 aragorn s story 題意 給一棵樹,並給定各個點權的值,然後有3種操作 i c1 c2 k 把c1與c2的路徑上的所有點權值加上k d c1 c2 k 把c1與c2的路徑上的所有點權值減去k q c 查詢節點編號為c的權值 分析 典型的樹鏈剖分題目,先進行剖分,然後用線段樹去維護即...
hdu3966 樹鏈剖分
近期在強化知識點深度。發現樹鏈剖分不是非常會寫了。回想一下改動操作 若兩個點在同一條鏈上,則直接改動這段區間。若不在同一條鏈上,改動深度較大的點到其鏈頂端的區間,同一時候將這個點變為他所在鏈頂端的父親,迴圈操作直到這兩個點在同一條鏈上。就能夠用上一種方法了。沒實用lca寫是由於曾經被坑過,不但沒有這...