笔记
今天是2023/10/19,停课第四天,整理一下思路吧……
拓扑排序、数学
拓扑很简单,关键是这个分数到底会多大。
观察到题目中有限制m最大是10,最多经过10个中转点,出边小于等于5,这些限制很明显就是规定了p,q的范围。
前者说明总水量最多是10,而每次分流都只是进行了分配水量的操作,总水量不变,所以过程中的每个节点的水量都不大于总水量。
算出q的范围,乘10倍就是p的范围。
考虑只分流了一次,对于一个节点,他会加上所有入边来的流量。
如果不约分,最多有100000条边,分母最大是\(5^{100000}\),写高精度都难受。
考虑通分之后用最简分母q算,相同的分母不会让q变大,不同的分母会让q变成二者的最小公倍数。
所以q最大是1,2,3,4,5的最小公倍数,也就是60。
分流一层,q最大是60,换言之,我们可以把分母是6,15,……都变成分母是60的分数。
下一次分流,\(w_1=\frac{...}{60}+\frac{...}{60\times5}+...\),点自己本身可能被分流过一次,分母是60,其它来的点都是第二次分流的点,分母也都是60,把\(\frac{1}{60}\)提取出来,新的分母最大也是60。
所以二层分母最大是\(60^2\)。
……
中转十次,相当于分流11次,分母最大是\({6^{11}}{10^{11}}\)。
然后q和10q都在__int128范围内,搞定。
其实本来是想分别记录两个q1,q2,然后分母是q1*q2,每次只给较小的那个乘上,后来发现好像不行。
如果是高精度,写更相减损术可能会TLE,观察到分母都是若干个1,2,3,4,5的成绩,分解质因数只有2,3,5。
所以每次分子分母尝试同除2,3,5,……。
复杂度小于\(O(log_2Q+log_3Q+log_5Q)\)。
高阶差分
适用于:给一段区间加上一个数列,并且这个数列若干次差分之后可变成常数列,注意每阶差分都要在r+1减去前缀和消除影响。
然后就是组合数有一个递推式子\(C(i,j)=C(i-1,j-1)+C(i-1,j)\),得到\(C(i,j)-C(i-1,j)=C(i-1,j-1)\),差分一次的数组可以写成组合数的形式。
写多几行找规律就行了……
2020牛客第六场NOIP提高模拟赛的C题。
因为有结算操作,可以把一个点的距离拆成不用结算的和要结算的。
这个时候比较两个点的距离需要综合考虑二者。
按照总的花费比较点的距离本身是没有问题的,用Dij的证明容易知道这是正确的,只是由于总花费相同,出租车没结算的距离可能不一样,所以要考虑这种情况。
把它看成第二关键字即可。
这种拆距离的题:
- 根据总花费比较。
- 总花费相同时,各个分花费之间的不同对于松弛是否有影响。
也可以直接用浮点数把结算操作去掉,注意ceil的时候减去eps消除误差。
在线维护一个有序序列可以用set。
2023.10.20
调试的优先级
- 观察数组是否开小
- 观察是否弄混变量名
- 对于套娃的题,比如昨天的T4,将计数部分、莫队部分、链表部分分别调试,这样会省事很多。(就是因为链表写错了,一直调计数,浪费时间)
假期计划里面,我们要保留前4大的数。
to[i].resize(4);
这样写,当to本来长度不足4的时候,会多出一些0,然后产生错误。
应该像下面这样写。
to[i].resize(min(4,(int)to[i].size()));
本题极其一眼的想法:
首先判断可达性。
然后\(O(N^4)\)枚举每个点。
然后考虑优化,一般都是优化某层循环,我们发现除了第一层和最后一层是定点1到动点,其余都是两个动点之间的距离。
一般从简单入手,比如优化最后一层循环:可达c,可达1的点(不等于c)。
考虑取最大值,发现可能是b,此时就重复了,所以要取次大值。
这时候有两个选择,一是记录从1出发的点的最大值和次大值;二是记录从c出发的点的最大值和次大值。
然后你会发现前者难以满足可达c的条件,所以把可达c作为一个状态当成下标,就和第二种一模一样了。
然后考虑优化第一层循环,会发现是完全对称的。
此时最大值可能等于c,次大值可能等于d,所以要记录三个最值。
同意一下,就得到了做法。

浙公网安备 33010602011771号