T1 小 R 的数学题(math)
题目大意
给定n,m求
15pt:n≤106,m≤5∗103
另35pt,n≤109,m=2,3,4,5
另25pt,n≤109,m≤200
另25pt,n≤109,m≤5000
题解
前
15pt
可以直接暴力
另35pt可以手推公式,m≤200的35pt可以递归求公式
我们推一下当
m=2
时的式子,设
Sn=∑ni=1i2
,对原式扰动一下
我们发现Sn被消掉了,但是我们得到了∑ni=1i的式子,所以我们考虑调整一下扰动
设Tn=∑ni=1i3
我们定义 fm(n)=∑ni=1im
这样的话需要得出m个多项式每个多项式m项,总复杂度是O(m3)
优化到 O(m2) 需要伯努利数,具体参见杜教的《多项式及求和》或具体数学吧
如果你不会伯努利数我们来看观察一下上面得出的公式
1∗f0(3)=(41−1)−1∗0
2∗f1(3)=(42−1)−1∗(20)f0(3)
3∗f2(3)=(43−1)−1∗(40)f0(3)−1∗(41)f1(3)
没错!!上面算法的瓶颈在于多项式计算!!!带成数值就可以优化掉一个 m 了!!!
CODE
T2 最短路(path)
题目大意
给定一棵树,每次的询问独立,添加一条边,询问有多少点对的最短路变小了
题解
一棵基环树,我们找到环之后,如果环上两点的最短距离改变的话,他们的子树中不在环上的部分的最短距离也会改变,所以预处理出每个点子树大小,因为树高不超过100,所以找环的复杂度不会很高,找到环之后处理出最短路改变的即可,子树大小乘起来计入答案,细节就慢慢思考吧~~
T3 最小花费(cost)
题目大意
给定一棵树,每次询问从s走到t,选择点权最小的点购买到下一个最近的且比该点点权小的点的路径长度的食物,询问花费数
题解
预处理倍增表
up2[i,j]:从i→i的第2j−1个fa,花费数之和
down1[i,j]:从i的第2j−1个fa→i,路径上最小点权
down2[i,j]:从i的第2j−1个fa→i,花费数之和
合并时
up1[i,j]=min{up1[i,j−1],up1[fa[i,j−1],j−1]}
pos=pos(up1[i,j−1])
由于最小值具有单调性,所以
pos
值可以二分求解
up2[i,j]=⎧⎩⎨⎪⎪up2[i,j−1]+up1[i,j−1]∗dis(fa[i,j−1],fa[i,j])up2[i,j−1]+up1[i,j−1]∗dis(fa[i,j−1],pos)+up1[fa[i,j−1],j−1]∗dis(pos,fa[i,j])up1[i,j−1]≤up1[fa[i,j−1],j−1]up1[i,j−1]>up1[fa[i,j−1],j−1]
down1[i,j]=min{down1[i,j−1],down1[fa[i,j−1],j−1]}
pos=pos(down1[fa[i,j−1],j−1])
由于最小值具有单调性,所以
pos
值可以二分求解
down2[i,j]=⎧⎩⎨⎪⎪down2[fa[i,j−1],j−1]+down1[fa[i,j−1],j−1]∗dis(i,fa[i,j−1])down2[fa[i,j−1],j−1]+down1[fa[i,j−1],j−1]∗dis(fa[i,j−1],pos)+down1[i,j−1]∗dis(pos,i)down1[i,j−1]≥down1[fa[i,j−1],j−1]down1[i,j−1]<down1[fa[i,j−1],j−1]
预处理出这些之后,对于每个询问
(s,t)
注意下面小括号的是用倍增处理出来的,不是指数组
lsum=up2(s,lca)
lmin=up1(s,lca)
rsum=down2(lca,t)
rmin=down1(lca,t)
pos=pos(lmin)在lca→t这条链上第一个≤lmin的位置
ans={lsum+lmin∗dis(lca,t)lsum+lmin∗dis(lca,pos)+rmin∗dis(pos,t)lmin≤rminlmin>rmin
总复杂度为O(Nlog2N)