HYSBZ 1036 樹的統計Count

2021-07-28 10:57:59 字數 2063 閱讀 3764

一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成

一些操作: i. change u t : 把結點u的權值改為t ii. qmax u v: 詢問從點u到點v的路徑上的節點的最大權值 i

ii. qsum u v: 詢問從點u到點v的路徑上的節點的權值和 注意:從點u到點v的路徑上的節點包括u和v本身

input

輸入的第一行為乙個整數n,表示節點的個數。接下來n – 1行,每行2個整數a和b,表示節點a和節點b之間有

一條邊相連。接下來n行,每行乙個整數,第i行的整數wi表示節點i的權值。接下來1行,為乙個整數q,表示操作

的總數。接下來q行,每行乙個操作,以「change u t」或者「qmax u v」或者「qsum u v」的形式給出。 

對於100%的資料,保證1<=n<=30000,0<=q<=200000;中途操作中保證每個節點的權值w在-30000到30000之間。

output

對於每個「qmax」或者「qsum」的操作,每行輸出乙個整數表示要求輸出的結果。

sample input

41 2

2 34 1

4 2 1 3

12qmax 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

sample output41

22106

56516

#include#include#include#includeusing namespace std;

const int maxn=3e4+5;

int read()

while(ch>='0'&&ch<='9')

return x*f;

}struct nodeed[maxn<<1];

int head[maxn],cnt;

void addedge(int u,int v)

int sz[maxn],fa[maxn],son[maxn],dep[maxn],p[maxn],top[maxn];

int pos;

void dfs1(int u,int pre,int d)

void update(int a,int b,int r)

int mid=(stu[r].l+stu[r].r)>>1;

if(a>mid)update(a,b,(r<<1)+1);

else update(a,b,r<<1);

pushup(r);

return ;

}int qmax(int l,int r,int rt)

void init()

int getmax(int u,int v)

re=max(re,qmax(p[f1],p[u],1));

u=fa[f1];

f1=top[u];

} if(dep[u]re=max(re,qmax(p[v],p[u],1));

return re;

}int getsum(int u,int v)

re=re+qsum(p[f1],p[u],1);

u=fa[f1];

f1=top[u];

} if(dep[u]re=re+qsum(p[v],p[u],1);

return re;

}int main()

dfs1(1,0,0);

dfs2(1,1);

for(int i=1;i<=n;i++)

build(1,pos-1,1);

int q;

q=read();

while(q--)

else if(str[1]=='m')

else printf("%d\n",getsum(a,b));

} } return 0;

}

HYSBZ 1036 樹的統計Count

題意 有一棵樹,每個節點有權值。我們現在有三個操作 1 改變某點的權值。2 給出兩個點,求這兩個點之間的路徑上所有點的權值之和。3 給出兩個點,求這兩個點之間的路徑上所有點的最大權值。乙個裸的樹剖,刷了兩三天樹剖的題了,感覺現在已經把樹剖理解的差不多了,具體操作現在已經可以很快在腦海中模擬出來了。i...

HYSBZ 1036樹鏈剖分

一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成 一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 i ii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 注意 ...

bzoj1036 樹的統計

一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 注意 從點...