【题解】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\)

有转移:

\[f_i=\max_{0\le j<i\wedge h_j>h_i\wedge v_j>v_i}f_j+1 \]

显然一个三维偏序(还有一维下标),考虑用 CDQ 将 dp 优化到 \(O(n\log^2n)\)


试着用残余的记忆,自己重新把三维偏序胡出来。下面是口嗨时间。

回忆一下 CDQ 的步骤:

  1. 先把大于等于 mid\(h\) 分到左边,小于的分到右边。(实际上这一维最好以下标分开(这样就不用 stable_partition 了。

    考虑把左边的部分按照 \(h\) 重新排序。

(口胡不下去了(因为感觉怪怪的就去看了一下之前的代码,感觉还是挺好理解,所以就不想写了(

所以下一个任务是在 15min 之内爆切 cdq(雾

结果花了20多分钟。😅



「BZOJ2961」共点圆

实际上数据保证的是:\(\forall y>0\)\(x\) 没有限制。


考虑形式化一下题意:

一个点 \((x,y)\) 在一个圆 \((x_i,y_i)\) 内当且仅当:

\[(x-x_i)^2+(y-y_i)^2\le x_i^2+y_i^2\\ \Leftrightarrow~ x^2-2x_ix+y^2-2y_iy\le0\\ \Leftrightarrow~ y_i\ge \dfrac {x^2-2x_ix+y^2}{2y}\\ \Leftrightarrow~ y_i\ge -\dfrac xyx_i+\dfrac {x^2+y^2}{2y}\\ %x(x-2x_i)+y(y-2y_i)\le0 \]

我们就是要找满足上式的 \((x_i,y_i)\) 有多少个。

不会了。😥


https://www.cnblogs.com/cjyyb/p/9466396.html

这类题还是做少了,每次都是这种式子推出来,但是不知道怎么用函数去理解了。

实际上,我们也不必求出具体有多少个满足(因为这个问题严格由于原题目),而这个式子的意思其实就是每个询问相当于给了一条直线,然后每个圆心必在这条线上面。

考虑把所有的圆心维护一个下凸包,然后斜率从小到大排序,每次去切凸包找到满足条件的最大截距,然后跟直线的截距比一下大小就好了。

考虑到取 max 具有结合律,我们就可以 cdq。

posted @ 2024-08-23 10:15  CloudWings  阅读(5)  评论(0编辑  收藏  举报