bzoj3531 樹刨 線段樹動態開點

2022-04-28 19:15:08 字數 2639 閱讀 7397

題意:一棵樹,每個點有顏色,4種操作,1.單點修改權值 2.單點修改顏色 3.查詢路徑顏色相同的點權和 4.查詢路徑顏色相同的點權最大值。

思路:樹刨+線段樹動態開點,開1e5個線段樹。

**:

#include

using

namespace std;

#define ll long long

#define forn(i,n) for(int i=0;i#define for1(i,n) for(int i=1;i<=n;++i)

#define io ios::sync_with_stdio(false);cin.tie(0)

const

int maxn =

2e5+5;

int a[maxn]

,b[maxn]

,head[maxn]

,deep[maxn]

,sz[maxn]

,par[maxn]

,son[maxn]

,p[maxn]

,fp[maxn]

,top[maxn]

,root[maxn]

;int n,q,tot =

1,id,cnt;

class

dsegment_tree

node[maxn*50]

;void

update

(int pos,

int v,

int&now,

int l =1,

int r = n)

int mid = l+r>>1;

if(pos<=mid)

update

(pos,v,node[now]

.son[0]

,l,mid)

;else

update

(pos,v,node[now]

.son[1]

,mid+

1,r)

; node[now]

.sum = node[node[now]

.son[0]

].sum+node[node[now]

.son[1]

].sum;

node[now]

.maxv =

max(node[node[now]

.son[0]

].maxv,node[node[now]

.son[1]

].maxv);}

intquery

(int l,

int r,

int now,

int l =1,

int r = n)

intquery2

(int l,

int r,

int now,

int l =1,

int r = n)

}tree;

struct edgee[maxn]

;void

add(

int u,

int v)

,head[u]

= tot;

e[++tot]

=,head[v]

= tot;

}void

dfs(

int u,

int pre,

int d)

}void

getpos

(int u,

int gg)

}int

calsum

(int x,

int y)

if(deep[x]

>deep[y]

)swap

(x,y)

; res+

=tree.

query

(p[x]

,p[y]

,root[z]);

return res;

}int

calmax

(int x,

int y)

if(deep[x]

>deep[y]

)swap

(x,y)

; res=

max(res,tree.

query2

(p[x]

,p[y]

,root[z]))

;return res;

}int

main()

dfs(1,

0,0)

;getpos(1

,1);

for1

(i,n) tree.

update

(p[i]

,a[i]

,root[b[i]])

;for1

(i,q)

else

if(s[1]

=='w'

)else

if(s[1]

=='s'

) cout<<

calsum

(x,y)

<<

'\n'

;else cout<<

calmax

(x,y)

<<

'\n';}

return0;

}

BZOJ 3531(樹鏈剖分 線段樹)

problem 旅行 bzoj 3531 題目大意 給定一顆樹,樹上的每個點有兩個權值 x,y 要求維護4種操作 操作1 更改某個點的權值x。操作2 更改某個點的權值y。操作3 求a b路徑上所有x屬性與a,b相同的點y屬性的和。操作4 求a b路徑上所有x屬性與a,b相同的點y屬性的最大值。n,q...

bzoj2243 樹刨 線段樹區間合併

題意 區間修改樹上兩點間的顏色種類,區間查詢樹上兩點間的線段數。思路 樹刨 線段樹,區間合併是第一次寫。思路為線段樹維護左端點和右端點的顏色,合併時相同就 具體實現不太好寫。include using namespace std define ll long long define forn i,n...

BZOJ 3531 旅行 樹鏈剖分 動態開點

題目鏈結 無優化版本 170行 首先樹剖可以維護樹上的鏈sum max 可以對每個宗教建一棵線段樹,那這題就很好做了 不過10 5需要動態開點 不明白為什麼nlogn不需要 就可以 不是每個insert加log個節點?操作修改完更改原數列!盲人。include include include def...