[AGC30D] Inversion Sum
设\(f_{i,j}\)表示\(a_i < a_j\)的概率,那么一次修改只会影响\(O(n)\)个二元组。
对于影响的二元组,有\(\frac{1}{2}\)的概率反转,有\(\frac{1}{2}\)的概率不反转,分别转移即可。
[AGC30F] Permutation and Minimum
对于原序列,我们每格两个位置分一组,记录\((?,?)\)、\((?,x)\)的个数,显然\((x,y)\)对答案无影响所以直接扔掉。
由于一组的答案为\(min(x,y)\),考虑从大往小依次放元素。
设\(f_{i,j,k}\)表示放完了\(2n\sim i\),有\(j\)个原本固定的元素未配对,有\(k\)个原本未固定的元素未配对。
对于一个原本固定的元素\(i\),它可以新增一个\(j\),也可以消去一个\(k\),注意由于\(i\)的位置固定,所以无论消去哪个\(k\)该组答案都是一样的,故转移系数也是\(1\)。
对于原本未固定元素,可以新增一个\(k\),或者与\(j\)中的一个配对,或者消去一个\(k\)。
转移时我们先不考虑\((?,?)\)的位置关系,最后乘上一个阶乘就行了。
[CF772D] Varying Kibibits
考虑已知集合\(X,Y\)的答案,如何知道集合\(X+Y\)的答案。
对于集合中的任意一组\(x\in X,y\in Y\),两组合并的答案\(ans = (x+y)^2 = x^2+y^2+2xy\)。
所以只需要维护集合\(S\)的0次答案、1次答案、2次答案即可做到合并集合。
剩下的东西直接高维前缀和处理,最后高维差分还原答案。
[CF908G] New Year and Original Order
考虑一个数\(p\)出现在第\(j\)位的条件:\(\sum_{i=1}^m [num_i\geq p] \ge j\)。
设\(f_{i,num,k,0/1}\)表示填了前\(i\)位,大于等于\(num\)的数字有\(k\)个的方案数,转移直接数位\(dp\)。
最后设\(g_{num,i} = \sum_{j=i}^n f_{1,num,j,0/1}\),则数\(p\)出现在第\(j\)位的方案数$ = g_{p,j} - g_{p+1,j}$。
[TopCoder11213] Apple Trees
先想一个暴力:枚举苹果树的排列,算出这种情况下至少要多长的序列,然后再把剩余的位置插板。
对于相邻的两棵树\(i,j\),它们之间的距离为\(max(r_i,r_j)\)。
所以我们按照\(r_i\)从小往大\(dp\),设\(f_{i,j,k}\)表示已经处理完了\(i\)棵苹果树,一共分成了\(j\)段,总长为\(k\)的方案数,转移就是新建段或合并段。
[TopCoder11351] The Cow Div One
我们假设前\(K-1\)个数随便选且和为\(S\),我们直接解出最后一个数,这样可能导致有的数被选了多次。
容斥,我们强制最后一个数\(x\)出现了至少\(t\)次,那么设前\(K-t\)个数的和为\(S\),则方程:\(tx + S \equiv 0 (mod\ p)\)。
在\([0,p]\)范围内,方程有解条件为\(gcd(t,p) | S\),解的个数为\(gcd(t,p)\),都比较显然。
设\(f_{i,S}\)表示前\(i\)个数的和为\(S\)的方案数,则\(f_{i,S} = \frac{1}{i} \sum_{j=1}^i (-1)^{j-i} \frac{n}{S}gcd(j,S) f_{i-j,gcd(j,S)}\)。
乘\(\frac{n}{S}\)是因为我们是要求\([0,n)\)中解的个数,\(\frac{1}{i}\)是因为我们相当于钦定最后一个数为特殊数,而实际要求的是无序方案。
观察转移方程,显然除了\(S=n\)的情况,一定有\(S|(K-i)\),故总状态数为\(KlogK\),即复杂度为\(O(K^2logK)\)。
[ARC71F] Infinite Sequence
注意到若连续两个元素大于\(1\),则之后的序列都要是这个元素。
设\(f_i\)表示\(i\)位置\(>1\)且未结束的方案数,枚举前一个\(>1\)的值\(v\),那么可以转移的范围就是一段前缀。
即\(f_i' = \sum_{v=2}^{i-2} \sum_{j=1}^{i-v-1} f_j = \sum_{v=2}^{i-2} s_{i-v-1} = \sum_{v=1}^{i-3} s_v = p_{i-3}\),维护\(s\)、\(p\)即可。
最后\(f_i = f_i' + 1\)表示当前位置为第一个\(>1\)的方案,答案\(Ans = \sum_{i=1}^{n-1}f_i(n-1)n + f_n(n-1) + 1\)。
[AGC13D] Piling Up
可以发现每次的操作就是不动或者把一个球反色。
主要的问题在于算重,我们把黑球的变化曲线画出来,强制这个曲线一定要碰到\(x\)坐标轴即可避免这个问题。
[CF375C] Circling Round Treasures
射线法,每个宝藏(炸弹)向右引一条射线,设\(f_{x,y,S}\)表示当前在\((x,y)\),射线经过奇偶性为\(S\)的最短路。
转移顺序不定,所以用\(spfa\)转移。
[CF1120A] Diana and Liana
先把可删个数\(m\)求出来,问题转为对于任意\(p = iK\),检查\([p,p+K+m)\)中每种元素的个数是否大于给定要求。
用一个双指针扫一遍即可。
[POJ1149] PIGS
对每个猪圈维护最后一次归属的操作编号。
每次操作相当于把若干操作编号合并,用并查集维护一下,建图后费用流完事。
[BZOJ3691] 游行
考虑把\(C\)的代价转化一下,可以发现我们每有一个点有入度,\(C\)的代价就会减少一个。
这启示我们拆点,建\(S\to u,u'\to T\),费用都为\(0\)流量都为\(1\)。
由于一个点可以经过多次,直接连原图的边是肯定不行的。
正确的做法是连接两点间的最短路,这样可能导致一种方案中\(C\)的代价算多了,但这样肯定不优所以没有问题。
费用流跑出有\(t\)个\(C\)时的额外代价\(B_t\),那么我们就是由若干函数\(F_t(C) = tC + B_t\)。
可以发现随着\(t\)递增,\(B_t\)递减,所以对于一个\(C\),\((t,F_t(C))\)一定会是一个凹函数,二分斜率找到最优位置。
[ZJOI2011] 营救皮卡丘
我们考虑第\(i\)个位置是如何被扩展的,显然第\(i\)个位置被扩展前,前\(i-1\)个位置都被扩展了。
所以建图:拆点\(u,u'\),连边\(u\to u'\)并用上下界强制经过。
然后对于所有\(u < v\),连边\(u' \to v\),费用为不经过大于\(v\)点的最短路,跑费用流即可。
[CF671D] Roads in Yusland (线段树做法)
设\(f_u\)表示把\(u\)子树内的所有边都覆盖,且覆盖了\((u,fa_u)\)的最小代价。
转移枚举与\(u\)在同一条链的端点\(v\),那么就是\((u,v)\)链 + 链上挂的子树答案 + \(v\)的所有儿子答案。
对链编号建立类似\(dfn\)序的东西,线段树直接维护每个\(v\)的答案即可。
[CF802C] Heidi and Library
考虑把\(K\)个位置分开,每个位置的书每变一次就会付出购买新书的代价。
把每一天要买的书排成一排,拆点,对于\(u < v\),若\(book_u=book_v\),则连费用为\(0\)的边,否则连\(cost_{book_v}\)的边。
[BZOJ4501] 旅行(口胡)
拓扑排序,可以写出转移方程:\(f_u = 1 + \frac{\sum_{u\to v} f_v}{deg_u}\)。
注意到这是一个平均数形式,用分数规划 + 最大闭合权子图得到最优答案。
[CF434D] Nanami's Power Plant
对于每一个函数,把每一个变量拆成一条链,\((x\to x+1)\)的流量为\(f(x)\)。
对于变量之间的限制,用[HNOI]切糕的方法连一连,跑最大割即可。
[CF671D] Roads in Yusland (对偶可并堆做法)
考虑对偶原理:\(min\{c^Tx|Ax\ge b\} = \max\{b^Ty | A^Ty\leq c\}\)。
带入:
原问题:\(c\)选第\(i\)个方案的费用,\(x\)为d选不选,\(A\)为选第\(i\)条边的代价,\(b\)为一个全\(1\)向量。
对偶问题:\(b^T\)为全\(1\)向量,\(y\)为每条边选的次数,\(A^T\)为第\(i\)条边出现在的方案,\(c\)为每个方案的边数限制。
等于问题转化为:每条边可以选任意多次,但需要满足每个方案包含范围内的边数小于等于其费用。
显然越靠下的边越优,所以那个可并堆维护当前点父边的最大选择次数,贪心就行了。
[UOJ336] 无限之环
黑白染色,不拆点,对于一个黑点u,分管道类型讨论:
- 度数为0,直接跳过。度数为1,建\((S,u,1,0)\),四个方向的接口分别连流量为0,费用为0,1,1,2的边。
- 度数为2、度数为3的,建\((S,u,2/3,0)\),然后u连向四个接口,流量为1,解方程得到每条边的费用是多少。
- 度数为4的,建\((S,u,4,0)\),然后u连向四个接口,费用都为0。
记录黑点\(S\to u\)的流量和\(W_1\)、白点\(v\to T\)的流量和\(W_2\),方案合法当且仅当\(W_1=W_2=MaxFlow\)。
[BZOJ4548] 小奇的糖果(口胡)
对于每种颜色,包含不包含它的方案左右边界一定会恰好卡在两个该颜色中间。
扫描线,自底向上扫描,那么对于向上选择的方案,每种颜色的限制在不断放松。
用线段树维护横坐标范围内点的个数即可。
[CF809D] Hitchhiking in the Baltic States(口胡)
设\(f_{i,j}\)表示前\(i\)个区间处理完后,长度为\(j\)的方案的最小右端点。
可以发现去掉第一维后,转移就是一个插入,一个区间平移,拿\(Treap\)随便弄弄。
[CF716E] Digit Tree(口胡)
点分,在每一个分治重心我们要统计的就是\(A10^{lenB} + B \equiv 0(mod K)\)。
由于有逆所以可以\(A +B10^{-lenB} \equiv 0 (mod\ K)\)。
[UOJ349] 即时战略(口胡)
考虑我们已经得到了一个联通块,随机一个位置点,找到离其最近的已知点。
找点过程暴力是\(O(n)\)的,考虑用点分树优化。
每次从点分树的根出发,每次移项找到点所在子树,这样找点次数就是\(O(logn)\)了,点分树用替罪羊维护。
[CF757G] Can Bash Save the Day?(口胡)
求\(\sum_{u=l}^r dis(x,u)\)改为维护\(\sum dep_u\)、\(\sum dep_{lca}\),用主席树维护一下。
交换\(a_i,a_{i+1}\)只会影响第\(i\)棵主席树,暴力重构即可。
[FJOI2016]神秘数(口胡)
从小往大处理,考虑已知最大数为\(S\),若下一个数\(num \leq S + 1\),则可以扩展到\(num + S\)。
实际中\(num\)可能是一段前缀的和,用主席树实现找\(num\)的过程。
设当前数为\(S\),这次可加前缀为\(pre\),加不进去的最后一个数为\(num\)。
那么\(pre \leq S +1\)、\(S+1 < pre + num\),两次操作后数\(S' \ge pre + num\),所以每两次操作\(S\)至少翻一倍。
[BZOJ3489] A simple rmq problem(口胡)
转化为三维数点,用可持久化树套树或者KD-Tree实现。
[51nod1685] 第K大区间2(口胡)
二分答案,把大于等于\(mid\)的位置设为\(1\),小于\(mid\)的位置设为\(-1\)。
\(check\)等于检查权值\(\ge 1\)的奇数长度区间个数,随便搞搞。
[BZOJ2741] L(口胡)
建立整个序列的可持久化\(Trie\),然后序列分块。
对于每一块,暴力处理块内答案,这一部分复杂度为\(O(\sqrt{n}(\sqrt{n})^2) = O(n\sqrt{n})\)。
然后枚举两个块,暴力\(for\)一块,另一块在\(Trie\)树中查询,得到块\(i\)与块\(j\)之间的最优答案\(g(i,j)\),这里复杂度\(O(n\sqrt{n}logn)\)。
然后用\(g\)预处理块\(l\)到块\(r\)之间的最优答案\(f_{l,r}\),即\(f_{l,r}=max(f_{l+1,r}f_{l,r-1},g_{l,r})\),这部分\(O(n)\)。
关于询问,首先把整块之间的答案用\(f\)查掉,对于两个散块,暴力\(for\)然后在可持久化\(Trie\)中查答案,复杂度\(O(n\sqrt{n}logn)\)。
[CF833E] Caramel Clouds
把区间离散化,设\(f_u\)表示只被云\(u\)覆盖的区间长度,设\(g_u\)表示选择云\(u\)和另一朵云的覆盖范围。
额外维护任意两云的相交长度\(Cross[u][v]\),维护不需要删云就能看到的长度\(S\)。
若一个区间被大于\(2\)多云覆盖,则这个区间一定看不到太阳。
若一个区间被\(2\)朵云覆盖,则两朵云的\(Cross\)增加,然后尝试更新两云的\(g\)。
若一个区间被\(1\)朵云覆盖,则该云的\(f,g\)增加。
最后一个问题,当一朵云第一次出现时,我们需要找到与它不交的另一朵云更新它的\(g\),把云按照\(cost\)排序,用线段树维护。
[LuoguP4514] 上帝造题的七分钟
矩阵加法、矩阵求和,考虑树套树。
由于树套树第二维不能\(PushUp\),考虑标记永久化,只不过标记变成了一棵线段树。
[CTSC2018] 暴力写挂
一个很显然的算法:边分,建虚树,然后在虚树上暴力\(dp\)。
考虑优化,不要每次都建虚树,先边分,然后把边分结构建出来,最后在第二棵树上边分树合并。
[UOJ370] 滑稽树上滑稽果
不难发现答案一定是一条链最优。
设\(DB\)为所有数相同的部分,这部分的答案不会改变,为\(n*DB\)。
那么我们的目标转变为,用尽量小的代价把前缀与变成\(DB\),设\(f_S\)从\(S\)集合出发还需要多少代价才能变成\(DB\)。
暴力转移就是枚举一个\(a_i\),然后\(f_{S\& a_i} + (S\& a_i) \to f_{S}\)。
考虑枚举一个\(S\)的子集\(T\),那么\(f_T + T\to f_S\)的条件为存在\(a_i\),使得\(a_i\&S = T\)。
我们可以发现,若\(S\& T = T\),则\(f_T \leq f_S\),因为把\(S\)的操作在\(T\)上做一次,答案并不会变差。
所以我们可以把转移条件转为存在\((a_i \& S) \in T\),然后用\(FWT\)判一下即可。
[UOJ371] 滑稽树下你和我
二分答案\(mid\)
有结论:若两次移动中,端点所属边没有改变,且移动前后两点距离都\(\leq mid\),那么移动一定合法。
比较显然,因为摆直一条直线后,另一条直线一定是单调移动的。
所以设\(f_{u,E}\)表示一个端点在\(u\)上,另一个点在边\(E\)上离\(u\)最近的点,这个状态是否能够到达。
转移考虑是\(u\)点移动,还是固定点转移到\(E\)的端点上即可,用记搜实现。
[UOJ350] 新年的XOR
首先可以发现\([2^t,2^{t+1})\)的异或和等于\(0\)。
我们考虑\(1\)到\(2^t \sim 2^{t} + k\)的异或和,可以发现异或和每四个一循环(考虑\(X0,X1,X2,X3\)即可)。
即我们可以拼出的数为:\(2^t + 4k\)、\(2^t + 4k-1\),所以我们可以解决\(n\%4 = 0,3\)的问题了。
用\(1\)进行微调,我们就可以解决\(n\%4 = 1,2\)了,注意特判\(n = 0,1,2,3\)。
[UOJ351] 新年的叶子
直径的中点(中边)一定会相交,这个比较显然就不证了。
问题转化为,有若干集合,每次从所有集合中随机染黑一个点,问染至只有一个集合没有被全染黑的期望时间。
首先把可重染色转化为不可重染色,然后考虑枚举一个集合,枚举染至终态时该集合被染了多少个元素。
设整棵树的叶子个数为\(S\),设集合总元素个数为\(A\),设有\(m\)个集合,第\(i\)个集合大小为\(a_i\)。
由于同类事件的概率相同,所以可以写出表达式(注意最后一个染的元素不能是枚举集合的):
\(Ans = \sum_{i=1}^m \sum_{j=1}^{a_i - 1} \frac{(A-a_i + j - 1)! (A - a_i) \sum_{t=A - j + 1}^A \frac{S}{t}}{(A - j)!}\),可以直接暴力算。
[LOJ530] 最小倍数
质数之间互不干扰,所以只需要求每个质数的答案再取\(max\)。
对于质数\(p\),考虑把\(n\)写成\(p\)进制数,那么这个\(n\)产生的质因子\(p\)个数是多少。
个数\(cnt = \sum_{j=1}^{\inf} \lfloor \frac{n}{p^j} \rfloor\),即每次把\(n\)在\(p\)进制下左移一位。
那么若第\(i\)位为\(v\),则它在\(i-1\)次左移中都贡献了答案,即贡献为\(v\sum_{j=1}^{i-1} p^j\),高位往低位贪心即可。
[BZOJ3601] 一个人的数论
\(Ans = \sum_{i=1}^n i^d [i\perp n] = \sum_{i=1}^n i^d \sum_{c|n} \mu(c) = \sum_{c|n}^n \mu(c) c^d \sum_{j=1}^{\frac{n}{c} } j^d\)。
一个非常妙的思路:\(F(t) = \sum_{j=1}^{t} j^d\)是一个\(d+1\)次多项式。
那么\(Ans = \sum_{c|n}^n \mu(c)c^d \sum_{j=0}^{d+1} a_j \frac{n}{c} = \sum_{j=0}^{d+1} a_j \sum_{c|n} (\frac{n}{c})^j c^d \mu(c)\)。
后面那是一个狄利克雷卷积,算出每个质因子的答案乘起来即可。
[CodeChef] Counting D-sets(口胡)
我们强制\(n\)维坐标的最小值为\(0\),这样就可以避免同构算重的问题了。
至于最大值至少为\(D\)的限制,我们可以用(可用\(\le D\)边权的方案数) - (可用\(\le D-1\)边权的方案数处理)。
然后就是使得每一维最小值都为\(0\)了,容斥,强制若干维最小值不为\(0\),即\(Ans_D = \sum_{j=0}^{n} (-1)^j \binom{n}{j}2^{D^i(D+1)^{n-i}}\)。
[CF961G] Partitions
显然所有物品之间等价,只需要计算出一个物品对答案的贡献系数,最后乘上总权值即可。
对于\(u\)所属集合\(S\),\(u\)对答案的贡献为\(w_uS\),这可以看作是每有一个元素与\(u\)同集合,\(u\)就贡献\(w_u\)的答案。
所以只需要讨论元素是否等于\(u\)即可,不难推出这个系数为\(S_1(n,K) + (n-1)S_1(n-1,K)\)。
[CodeChef] Counting is life
对于第一问,若\(n,K\)奇偶性相同,则答案为\((11..11)_2\),否则答案为\((11..10)_2\)。
对于第二问,若\(n,K\)奇偶性相同,我们要求的就是选\(n\)个元素,每一种元素出现奇数次的方案数。
即生成函数\((\frac{e^x - e^{-x}}{2})^K\)的\(n\)次项系数,暴力展开有\(Ans = \frac{1}{2^K}\sum_{j=0}^K \binom{K}{j} (-1)^{K-j}(2j-K)^n\)。
若奇偶不同,则\(1\)的选择次数为偶数,即\((\frac{e^x-e^{-x}}{2})^{K-1}(\frac{e^x + e^{-x}}{2})\),同样暴力展开即可得解。
[UOJ450] 复读机
考虑构造生成函数:\(f(x) = \sum_{j=0}^{\inf} [d|j] \frac{x^j}{j!} = \frac{1}{d}\sum_{j=0}^{\inf} (\sum_{k=0}^{d-1} w_d^{jk}) \frac{x^j}{j!}\)。
那么\(f(x) = \frac{1}{d}\sum_{k=0}^{d-1} \sum_{j=0}^{\inf} \frac{w_d^{kj} x^j}{j!} = \frac{1}{d} \sum_{k=0}^{d - 1} e^{w_d^kx}\),要求的东西为\((\frac{1}{d}\sum_{j=0}^{d-1} e^{w_d^kx})^K\)的\(n\)次项系数。
直接暴力展开,枚举每种\(d\)有几个即可。
[LOJ6392] 密码学第三次小作业(口胡)
我们有:\(a^xb^y \equiv m^{cx+dy} \equiv m^1 (mod\ n)\)
\(c\perp d\)保证了\(cx+dy=1\)有解,\(m\perp n\)保证了有逆(即\(x,y\)可为负数),扩欧求解即可。
[UOJ424] count
若\(n < m\)显然无解。
定义\(A =\)长度为\(n\),\([1,m]\)都出现过的方案数。定义\(B =\)长度为\(n\),序列最大值为\(m\)的方案数。
定义\(C =\)长度为\(n\),所有数都出现在\([1,m]\)的方案数。根据定义显然有:\(C\ge A\)、\(C\ge B\)。
考虑证明\(A = C, B = C\),从而证明\(A = B\)。
对于\(C\)中的一种方案,我们把所有数加上\(m - max\)得到的序列与\(B\)中序列同构,故\(C\le B\),即\(C = B\)。
对于\(C\)中的一种方案,我们从小往大、从左往右重新分配标号,由于\(n\ge m\),所以一定能够把\(m\)个数都分完,故\(C\le A\),即\(C = A\)。
所以\(A = C = B\),我们目标求解\(A\),现在我们可以求解\(B\)。
设\(f_{i,j}\)表示长度为\(i\),最大值为\(j\)的方案数,对于一种方案,我们只在其最大值达到上界时计算,这样就避免了算重。
根据上面的去重方法,我们有:\(f_{i,j} = \sum_{p=1}^{i} f_{p-1,j-1}f_{i-p,j}\),其中\(f_{0,j} = 1\)。
设\(F_i(x) = \sum_{j=0}^{n} f_{j,i}x^i\)(注意\(dp\)两维下标名称进行了交换),则\(F_i(x) = F_{i-1}(x)F_i(x)x + 1\)。
所以\(F_i(x) = \frac{1}{1 - F_{i-1}(x)x}\)。
我们把\(F_i(x)\)写成\(\frac{A_i(x)}{B_i(x)}\)的形式(不知道这步集训队爷们是怎么想到的),
带入上面的转移式中有:\(\frac{A_i(x)}{B_i(x)} \to \frac{B_i(x)}{B_i(x) - A_i(x)x}\),即\(A_{i+1}(x) = B_i(x),B_{i+1}(x) = B_i(x) - A_i(x)x\),注意到都是一次形式,所以可以矩阵快速幂。
然而矩阵中每个位置放一个多项式肯定行不通,但我们只关心\(A_{m}(x),B_{m}(x)\)是什么,所以直接带入单位根即可。
最后\(IDFT\)得到\(A_m(x),B_m(x)\)后多项式求逆即可得到\(F_m(x)\),答案就是\([x^n] F_m(x)\)。
[CF1137C] Museums Tour
考虑暴力拆点,把一个点的\(d\)个时刻分别建一个点,然后缩点再拓扑排序。
这样唯一的问题在于可能会导致某个点的时刻\(t_1\)在拓扑序上可到达时刻\(t_2\)。
但冷静分析一下,设\(t_1\to t_2\)走了长度为\(len\)的路径,那么我们已知走长度为\(len\)的路径,则一定会形成一个大小为\(\frac{d}{gcd(len,d)}\)的环。
所以若\(t_1\to t_2\),则一定有\(t_2\to t_1\),故不会算重直接做就行了。
[CERC2017]Gambling Guide
设\(d_u\)表示\(u\)点的出度,先列出\(dp\)方程式:\(f_u = \frac{\sum_{u\to v}min(f_u,f_v)}{d_u} + 1\)。
化简:\(f_u = \frac{f_u \sum_{u\to v} [f_u < f_v]}{d_u} + \frac{\sum_{u\to v} [f_v \leq f_u] f_v}{d_u} + 1\),移项后有\(f_u = \frac{d_u + \sum_{u\to v}[f_v\leq f_u]f_v}{\sum_{u\to v}[f_v \leq f_u]}\)。
考虑用一个\(f_v \leq f_u\)的点\(v\)去更新\(f_u\),即把\(u\)的转移式中增加一个\([f_v \leq f_u]\)。
设加入\(v\)前,\(F = \sum_{u\to v}[f_v\leq f_u]f_v\),\(P = \sum_{u\to v}[f_v\leq f_u]\),即\(f_u = \frac{F+d_u}{P} \ge f_v\)
故\(F + d_u \ge Pf_v\),即\(F + d_u - Pf_v \ge 0\)。
设更新后的结果为\(f_u'\),即\(f_u' = \frac{F+f_v + d_u}{P+1}\)。
那么\(f_u' - f_v = \frac{F + d_u + f_v - (P+1)f_v}{P+1} = \frac{F+d_u - Pf_v}{P+1} \ge 0\),即\(f_u' \ge f_v\)。
同时\(f_u - f_u' = \frac{(P+1)(F+d_u)}{P(P+1)} - \frac{P(F+f_v+d_u)}{P(P+1)} = \frac{F+d_u - f_vP}{P(P+1)}\ge 0\),即\(f_u \ge f_u'\)。
所以\(f_v \le f_u' \le f_u\),即\(v\)对\(u\)能够产生更新,且更新后的\(u'\)不会更新到\(v\)。
这满足\(Dijikstra\)的贪心性质,所以直接用堆按照\(Dijikstra\)的方式转移即可。