码迷,mamicode.com
首页 > 其他好文 > 详细

# 差分法

时间:2018-09-16 15:37:34      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:https   复杂   cdn   load   upload   ext   思路   现在   时间   

$\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即可。
技术分享图片

# 差分法

标签:https   复杂   cdn   load   upload   ext   思路   现在   时间   

原文地址:https://www.cnblogs.com/WonderfulZealousTom/p/9655736.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!