D 樹上求和

2022-06-02 03:54:09 字數 2354 閱讀 1211

這道題直接用了樹鏈剖分的板子

套上模板之後,需要注意的就是平方和的求法

1 #include2 #include3 #include4 #include5 #include6

#define rint register int

7#define mem(a,b) memset(a,(b),sizeof(a))

8#define temp template9

using

namespace

std;

10 typedef long

long

ll;11

const

int maxn=200000+10;12

const

int mod=23333;13

intn,m,r;

14//

見題意15

ll w[maxn],wt[maxn];

16//

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

17int

son[maxn],id[maxn],fa[maxn],cnt,dep[maxn],siz[maxn],top[maxn];

18//

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

19//

查詢答案

20struct

node

21g[maxn<<2]; int head[maxn]; int

num;

24struct

tre25

tree[maxn<<2

];29

void add(int u,int

v)30

34void pushdown(int rt,int

lenn)

4647

void build(int l,int r,int

root)

55int mid=l+r>>1

;56 build(l,mid,root<<1

);57 build(mid+1,r,root<<1|1

);58 tree[root].sum=(tree[root<<1].sum+tree[root<<1|1].sum)%mod;

59 tree[root].res=(tree[root<<1].res+tree[root<<1|1].res)%mod;60}

6162 ll query(int l,int r,int

root)

67if(tree[root].lazy)pushdown(root,r-l+1

);68

int mid=l+r>>1

;69 ll ans=0;70

if(l<=mid) ans+=query(l,r,root<<1),ans%=mod;

71if(r>mid) ans+=query(l,r,root<<1|1),ans%=mod;

72return

ans;73}

74void update(int l,int r,ll val,int

root)

81else89}

90int qrange(int x,int

y)98

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

99if(dep[x]>dep[y])swap(x,y);//

把x點深度更深的那個點

100 ans+=query(id[x],id[y],1);//

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

101return ans%mod;

102}

103104

void updrange(int x,int y,int k)

111if(dep[x]>dep[y])swap(x,y);

112 update(id[x],id[y],k,1

);113

}114

115void dfs1(int u,int f,int deep)

127}

128129

void dfs2(int u,int topf)

140}

141void

init()

142146

intmain()

155 dfs1(1,0,1

);156 dfs2(1,1

);157 build(1,n,1

);158

while(m--)

166else

170}

171return0;

172 }

view code

樹上求和(dfs

有一棵包含n個節點和n 1條邊的樹,規定樹鏈 u,v 為樹上從u到v的簡單路徑。樹的每條邊上都有乙個正整數,這個正整數被稱作這條邊的顏色,規定一條樹鏈的權值w u,v 為這條樹鏈上所有邊的顏色的代數和。而整棵樹的權值為所有不同的樹鏈的權值的代數和。已知所有邊的顏色集合恰好為1到n 1這n 1個不同的...

bzoj5293 樹上倍增 求和

description master 對樹上的求和非常感興趣。他生成了一棵有根樹,並且希望多次詢問這棵樹上一段路徑上所有節點深度的k 次方和,而且每次的k 可能是不同的。此處節點深度的定義是這個節點到根的路徑上的邊數。他把這個問題交給 了pupil,但pupil 並不會這麼複雜的操作,你能幫他解決嗎...

樹上求和( dfs序 線段樹 )

題目鏈結 解題報告 將樹轉化成dfs序,對於任意節點及其子樹總是一段連續的區間,那麼轉化成區間問題。ai b 2 ai ai 2 ai b b b 很明顯線段樹維護即可。define first f define second s define ll long long define mp make...