這道題直接用了樹鏈剖分的板子
套上模板之後,需要注意的就是平方和的求法
1 #include2 #include3 #include4 #include5 #include6view code#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 }
樹上求和(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...