很經典的樹剖板子題目
題目傳送門
結果點了這裡直接去了題解空間
時間限制: 2 s
空間限制: 128000 kb
題目等級 : 大師 master
一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。
我們將以下面的形式來要求你對這棵樹完成一些操作:
i. change u t : 把結點u的權值改為t
ii. qmax u v: 詢問從點u到點v的路徑上的節點的最大權值
iii. qsum u v: 詢問從點u到點v的路徑上的節點的權值和
注意:從點u到點v的路徑上的節點包括u和v本身
輸入檔案的第一行為乙個整數n,表示節點的個數。
接下來n – 1行,每行2個整數a和b,表示節點a和節點b之間有一條邊相連。
接下來n行,每行乙個整數,第i行的整數wi表示節點i的權值。
接下來1行,為乙個整數q,表示操作的總數。
接下來q行,每行乙個操作,以「change u t」或者「qmax u v」或者「qsum u v」的形式給出。
對於每個「qmax」或者「qsum」的操作,每行輸出乙個整數表示要求輸出的結果。
1 22 3
4 14 2 1 3
qmax 3 4
qmax 3 3
qmax 3 2
qmax 2 3
qsum 3 4
qsum 2 1
change 1 5
qmax 3 4
change 3 6
qmax 3 4
qmax 2 4
qsum 3 4
對於100%的資料,保證1<=n<=30000,0<=q<=200000;中途操作中保證每個節點的權值w在-30000到30000之間。
這裡直接附上**:
#include#include#include#define ls p<<1
#define rs p<<1|1
#define mid (shu[p].l+shu[p].r >>1)
#define ri register int
using namespace std;
const int sz = 300010;
int pos[sz],son[sz],top[sz],size[sz];
int dep[sz],fa[sz],fir[sz],nxt[sz];
int w[sz];
int tot,n,q,cnt,x,y,num;
char ch[15];
struct nodeshu[sz<<2];
struct edl[sz<<1];
inline void read(int &x)
while(ch >= '0' && ch <= '9')
if(flag)
x *= -1;
}inline void add(int f,int t)
; nxt[tot]=fir[f];
fir[f]=tot;
}inline void build(int p,int l,int r)
int midd = l+r>>1;
build(ls,l,midd);
build(rs,midd+1,r);
shu[p].sum=shu[ls].sum+shu[rs].sum;
shu[p].max=max(shu[ls].max,shu[rs].max);
}void dfs1(int k,int f,int d)
}void dfs2(int k,int tot)
}void in(int p,int x,int v)
if(x<=mid)
in(ls,x,v);
else
if(x>mid)
in(rs,x,v);
shu[p].sum=shu[ls].sum+shu[rs].sum;
shu[p].max=max(shu[ls].max,shu[rs].max);
}int qsum(int p,int l,int r)
int qmax(int p,int l,int r)
int dosum(int x,int y)
if(pos[x]>pos[y])
swap(x,y);
ans+=qsum(1,pos[x],pos[y]);
return ans;
}int domax(int x,int y)
if(pos[x]>pos[y])
swap(x,y);
ans=max(ans,qmax(1,pos[x],pos[y]));
return ans;
}int main()
else
}return
0;
}
樹鏈剖分 樹鏈剖分講解
好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 vector v maxn int size maxn dep maxn val maxn id maxn hson maxn top maxn fa maxn 定義 int edge 1,num 1 struct tree e ma...
ZJOI2008 樹的統計(樹鏈剖分)
一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 注意 從點...
BZOJ p1036 樹的統計 樹鏈剖分
對於一棵樹上兩個節點所構成的鏈的操作,我們可以用樹鏈剖分,來將樹轉化為多條鏈的集合 線性結構 從而將樹上鏈的結構轉化為線性結構的區間操作.找出每個節點的重兒子 包含節點最多的兒子 重兒子優先輸出dfs序 對於如下一棵樹進行剖分 找出其重兒子 紅色線 每個節點與其重兒子遞迴組成一條鏈 葉子節點沒有重兒...