# 差分法

$\color{red}\text{差分法是啥?}$

我们还是结合题目来理解吧:P1083 借教室

如果浓缩一下题目的意思,如下:

有m个人,每个人要借di个教室,总共借si-ti天,现在要你尽可能地满足每个人的教室需求量。

按照常规思路,我们可能会建立一个结构体变量a数组,然后把所有信息都输进去。再用一个day数组记录每天有多少个教室被借出去,然后用一个for循环m次,每次一个for循环(ti-si)次,每次把day[i]++即第i天的教室数加一。

这样子看起来是很简单粗暴,但是这样的方法时间复杂度是n^2。我们还要加上输入的时间,还要考虑其他诸多因素,时间肯定会爆掉。

那么,有没有一种方法,可以使时间变得更短呢?

答案是,有。这就是今天我要介绍的差分法。

首先,我们建立几个数组:day[1000]、borrow[1000];其中day表示当天是否有教室借阅情况,初始值全都赋值为0.然后borrow我们等会再讲。如下图:

然后,我们输入数据:

10 3
1 1 5
2 4 6
4 3 7

先处理第一组数据:3 1 5。表示3个教室从第1天借到第5天

我们在borrow表格里作如下处理:borrow[1]++,borrow[5+1]--;

我们再在下面建立一个数组:res,来演示实际的day。

我们会发现:res[i]+borrow[i+1]=res[i+1]

通过这种方法,我们就不必再去进行si-ti的循环,对每一天进行加法,我们只需要把这个天的头和尾做一个标记即可。

同理:如果di=2,我们只需要在borrow[4]+=2和borrow[6+1]-=2即可。

猜你喜欢

转载自www.cnblogs.com/WonderfulZealousTom/p/9655736.html