CS 2460 樹的統計(樹鏈剖分)

2021-08-08 19:58:45 字數 2449 閱讀 5225

很經典的樹剖板子題目

題目傳送門

結果點了這裡直接去了題解空間

時間限制: 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序 對於如下一棵樹進行剖分 找出其重兒子 紅色線 每個節點與其重兒子遞迴組成一條鏈 葉子節點沒有重兒...