P3833 SHOI2012 魔法樹 樹鏈剖分

2021-10-01 10:45:09 字數 2699 閱讀 8695

#include

#define ll long long

#define rll register int

using

namespace std;

template

<

typename t>

inline

void

read

(t &x)

#define mid ((l+r)>>1)

#define lson rt<<1,l,mid

#define rson rt<<1|1,mid+1,r

#define len (r-l+1)

const ll maxn=

500000+10

;ll n,m;

//見題意

ll tot,head[maxn]

,nex[maxn]

,to[maxn]

,w[maxn]

,wt[maxn]

;//鏈式前向星陣列,w、wt初始點權陣列

ll a[maxn<<2]

,laz[maxn<<2]

;//線段樹陣列、lazy操作

ll son[maxn]

,id[maxn]

,fa[maxn]

,cnt,dep[maxn]

,siz[maxn]

,top[maxn]

;//son重兒子編號,id新編號,fa父親節點,cnt dfs_clock/dfs序,dep深度,siz子樹大小,top當前鏈頂端節點

ll res=0;

//查詢答案

inline

void

add(ll x,ll y)

//-------------------------------------- 以下為線段樹

inline

void

pushdown

(ll rt,ll lenn)

inline

void

build

(ll rt,ll l,ll r)

build

(lson)

;build

(rson)

; a[rt]

=(a[rt<<1]

+a[rt<<1|

1]);

}inline

void

query

(ll rt,ll l,ll r,ll l,ll r)

else

}inline

void

update

(ll rt,ll l,ll r,ll l,ll r,ll k)

else

}//---------------------------------以上為線段樹

//當我們要處理任意兩點間路徑時:

//設所在鏈頂端的深度更深的那個點為x點

////ans加上x點到x所在鏈頂端 這一段區間的點權和

//把x跳到x所在鏈頂端的那個點的上面乙個點

//不停執行這兩個步驟,直到兩個點處於一條鏈上,這時再加上此時兩個點的區間和即可

//這時我們注意到,我們所要處理的所有區間均為連續編號(新編號),於是想到線段樹,用線段樹處理連續編號區間和

//每次查詢時間複雜度為o(logn)^2

inline

void

updrange

(ll x,ll y,ll k)

if(dep[x]

>dep[y]

)swap

(x,y)

;update(1

,1,n,id[x]

,id[y]

,k);

}//處理一點及其子樹的點權和:

//想到記錄了每個非葉子節點的子樹大小(含它自己),並且每個子樹的新編號都是連續的

//於是直接線段樹區間查詢即可

//時間複雜度為o(logn)

inline ll qrange

(ll x,ll y)

//直到兩個點處於一條鏈上

if(dep[x]

>dep[y]

)swap

(x,y)

;//把x點深度更深的那個點

res=0;

query(1

,1,n,id[x]

,id[y]);

//這時再加上此時兩個點的區間和即可

ans+

=res;

return ans;

}//當然,區間修改就和區間查詢一樣的啦~~

inline

void

updson

(ll x,ll k)

inline ll qson

(ll x)

inline

void

dfs1

(ll x,ll f,ll deep)

}inline

void

dfs2

(ll x,ll topf)

}int

main()

dfs1(1

,0,1

);dfs2(1

,1);

build(1

,1,n);

scanf

("%lld"

,&m)

;while

(m--

)else

}}

洛谷 P3833 SHOI2012 魔法樹

shoi2012 d2t3 harry potter 新學了一種魔法 可以讓改變樹上的果子個數。滿心歡喜的他找到了乙個巨大的果樹,來試驗他的新法術。這棵果樹共有n個節點,其中節點0是根節點,每個節點u的父親記為fa u 保證有fa u u。初始時,這棵果樹上的果子都被 dumbledore 用魔法清...

洛谷 P3833 SHOI2012 魔法樹

shoi2012 d2t3 harry potter 新學了一種魔法 可以讓改變樹上的果子個數。滿心歡喜的他找到了乙個巨大的果樹,來試驗他的新法術。這棵果樹共有n個節點,其中節點0是根節點,每個節點u的父親記為fa u 保證有fa u u。初始時,這棵果樹上的果子都被 dumbledore 用魔法清...

樹鏈剖分 P3833 SHOI2012 魔法樹

harry potter 新學了一種魔法 可以讓改變樹上的果子個數。滿心歡喜的他找到了乙個巨大的果樹,來試驗他的新法術。這棵果樹共有n個節點,其中節點0是根節點,每個節點u的父親記為fa u 保證有fa u u。初始時,這棵果樹上的果子都被 dumbledore 用魔法清除掉了,所以這個果樹的每個節...