笔记

今天是2023/10/19,停课第四天,整理一下思路吧……

P7113 [NOIP2020] 排水系统

拓扑排序、数学

拓扑很简单,关键是这个分数到底会多大。

观察到题目中有限制m最大是10,最多经过10个中转点,出边小于等于5,这些限制很明显就是规定了p,q的范围。

前者说明总水量最多是10,而每次分流都只是进行了分配水量的操作,总水量不变,所以过程中的每个节点的水量都不大于总水量。

\[\frac{p}{q}\le10,p\le10q \]

算出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)\)

Curious Array

高阶差分

适用于:给一段区间加上一个数列,并且这个数列若干次差分之后可变成常数列,注意每阶差分都要在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的证明容易知道这是正确的,只是由于总花费相同,出租车没结算的距离可能不一样,所以要考虑这种情况。

把它看成第二关键字即可。

这种拆距离的题:

  1. 根据总花费比较。
  2. 总花费相同时,各个分花费之间的不同对于松弛是否有影响。

也可以直接用浮点数把结算操作去掉,注意ceil的时候减去eps消除误差。


在线维护一个有序序列可以用set


2023.10.20

调试的优先级

  1. 观察数组是否开小
  2. 观察是否弄混变量名
  3. 对于套娃的题,比如昨天的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,所以要记录三个最值。

同意一下,就得到了做法。

posted @ 2023-10-19 09:23  Zlc晨鑫  阅读(27)  评论(0)    收藏  举报