洛谷 P4697 Balloons [CEOI2011] 单调栈/dp (待补充qwq)

时间:2023-03-08 23:35:15
洛谷 P4697 Balloons [CEOI2011] 单调栈/dp (待补充qwq)

正解:单调栈/dp

解题报告:

先放个传送门qwq

话说这题是放在了dp的题单里呢?但是听说好像用单调栈就可以做掉所以我就落实下单调栈的解法好了qwq

(umm主要如果dp做好像是要斜率优化凸壳维护双端队列巴拉巴拉可能要以后再来搞了qwq)

先解释题意...我觉得我是傻逼,,,这题我因为没懂题意卡了好几周了有...

是酱婶的,就是说给一些气球,开始它们都只是瘪的,都还没打气

然后给你这些气球的横坐标和最大半径

然后问你,我现在一个个给气球打气,打到不能打为止,问你每个气球的半径

(,,,我之前一直傻逼地以为是每个气球已经飘起来了然后给你飘着的纵坐标问你rmax,,,导致我一度没懂这题QAQ直到问大佬这题才明白题意,,,果然还是我太傻逼QAQ

首先还是比较简单地能推出,如果给气球i充气的时候和j相撞了,ri=(xi-xj)2/4rj这个还比较容易推画个图就能发现不详说了qwq

然后如果我们每次都一个个枚举我们要充的这个气球会和哪个气球相撞显然是不现实的,复杂度过不去,考虑怎么降复杂度

可以先思考怎么样一个气球是绝对不会有贡献的:

1)如果后面有个气球半径比前面的大,前面的显然是不会产生贡献了,这个比较好理解的哦就不详细解释辣qwq

  →这个性质就告诉我们,可以维护一个x递增r递减的单调栈

2)如果我从当前气球往前枚举,到了某个气球的时候ri已经小于rj了,那j之前的气球显然也不会产生贡献了(解释在后面qwq)

  →这个性质的话就可以使它做到一半就能得到答案不用一直一直做下去,降低复杂度

然后这样的话就成功从n2降到了n!

over

(

哦关于第二个性质的理解,我强行理解了一波

先定义一下我现在在做的气球叫i,找到的ri<rj的气球叫j,当前枚举的j之前的气球叫k,当前用公式算出来的ri叫ri,算到j的时候小于了rj的i的r叫真实ri,同理rj真实rj,那当前的rj显然是算的rj=(xj-xk)2/4rk算出来的

因为显然ri必大于rj必大于真实rj必大于真实ri所以就欧克了×

ummm详细说下,我之前理解了然后再想一遍就又理解了半天QAQ所以还是详细写下趴QAQ不然估计之后每次还是要理解半天QAQ

由已知得xi>xj>xk,所以ri>rj

又因为rj>=真实rj,所以ri>真实rj

又因为真实rj>真实ri,所以ri>真实ri

显然的是r是要取最小值的嘛

所以当ri<rj的时候就可以停止了

over!