说实话,这道题是我随机跳到的。初看觉得不难,结果在码代码的时候遇到很多问题。最后,八WA之后终见AC。这一定是我太蒟了
题意
我觉得本题题意也是一大难点,所以在看题目时要逐字,多看几遍。我在做的过程中,看错了两遍题目(前车之鉴),可能是本人的语文不好
本题的意思大概就是,在一个坐标系中,有n架飞机直线飞行(当然不是匀速),给定X坐标范围,又给定每架飞机的起始高度和终止高度。(其实就相当于n条一次函数的图象)。每架飞机还有一个干扰值,表示影响它正下方的飞机太阳吸收能力的强弱。现有Q个问题,请你求出区间[Si,Si+K]中,第Pi架飞机的太阳能板吸收的太阳光减少的值。我所说的难理解的地方就在这里。这里要求的并不是只要在该区间范围内能出现在第Pi架飞机上方的飞机。而是要求该区间中的每一时刻的减少的值中的最大值(可以这么理解)。
$\large\mathcal{Solution}$
刚开始真的无从下手,然后就看到。。。
这才有点眉目。
对于n架飞机,我们可以预处理出每两架飞机航线(相当于一次函数)之间的关系(要么相交,要么不相交)。而只要两架飞机不在相交点上,就一定存在其中一架飞机对另外一家飞机有影响。也就是说,任何一架飞机对于一架它可以影响的飞机,影响的范围只可能是 [0,相交点),(相交点,X](相交的情况)、[0,X](不相交的情况)。
知道了可影响范围的计算,于是一个奇妙的想法萌发,前缀和!因为对于一架飞机而言,它的被影响的值只有在经过一个交点后才会改变(因为飞机的相对位置就改变了)。因此,就可以记录下每个影响范围的起点和终点,利用区间加值的方法(这个,相信一般人都会吧)。这时候就可以利用前缀和,造一个前缀和数组,这样就可以得出每架飞机每一个时刻的被影响值。
最后回答问题的时候,只要先利用二分找出起点,然后往后跳,直到终点,中途用一个变量记录最大值即可。(不清楚的请看代码注解)
这样,这道题就解决了。
附:
这是本蒟蒻的第一篇题解,望支持。如有错误或有更优解,请告知。
CCO官网上有数据 传送门
这是一篇之前blog搬过来的文章,码风勿喷
嘤嘤嘤
$\large\mathcal{Code}$
1 | //本代码中的快读和快输均是之前尝试时加的,没有应该问题不大 |
$\Huge{祝大家RP++!!!}$