【题解】Solution Set - NOIP2024集训Day14 CDQ分治
【题解】Solution Set - NOIP2024集训Day14 CDQ分治
https://www.becoder.com.cn/contest/5482
「CF364E」Empty Rectangles
*3000
摆烂了。
好像是所谓 “二维分治” 的板子?
https://www.luogu.com.cn/article/807acdxs
「SDOI2011」拦截导弹
CDQ的例题,之前做过(现在试图自己再做出来。
第二问只用在第一问里面记录每一次是从哪个 \(j\) 转移过来的,以及当前位的方案数就行了。
看了之前的代码,发现其实还不止,这里其实还需要乘上后面的方案数。
也就是说,可能性 = (前方案数 \(\times\) 后方案数) \(\div\) 总方案数
下对于第一问考虑 dp。
\(f_i\) 前 \(i\) 个,钦定拦截第 \(i\) 个能拦截的最多个数。
令:\(f_0=0,h_0=\inf,v_0=\inf\)。
有转移:
显然一个三维偏序(还有一维下标),考虑用 CDQ 将 dp 优化到 \(O(n\log^2n)\)。
试着用残余的记忆,自己重新把三维偏序胡出来。下面是口嗨时间。
回忆一下 CDQ 的步骤:
-
先把大于等于
mid
的 \(h\) 分到左边,小于的分到右边。(实际上这一维最好以下标分开(这样就不用stable_partition
了。考虑把左边的部分按照 \(h\) 重新排序。
(口胡不下去了(因为感觉怪怪的就去看了一下之前的代码,感觉还是挺好理解,所以就不想写了(
所以下一个任务是在 15min 之内爆切 cdq(雾
结果花了20多分钟。😅
「BZOJ2961」共点圆
实际上数据保证的是:\(\forall y>0\) 而 \(x\) 没有限制。
考虑形式化一下题意:
一个点 \((x,y)\) 在一个圆 \((x_i,y_i)\) 内当且仅当:
我们就是要找满足上式的 \((x_i,y_i)\) 有多少个。
不会了。😥
https://www.cnblogs.com/cjyyb/p/9466396.html
这类题还是做少了,每次都是这种式子推出来,但是不知道怎么用函数去理解了。
实际上,我们也不必求出具体有多少个满足(因为这个问题严格由于原题目),而这个式子的意思其实就是每个询问相当于给了一条直线,然后每个圆心必在这条线上面。
考虑把所有的圆心维护一个下凸包,然后斜率从小到大排序,每次去切凸包找到满足条件的最大截距,然后跟直线的截距比一下大小就好了。
考虑到取 max 具有结合律,我们就可以 cdq。