bzoj 2961 共點圓 cdq分治

2021-07-11 05:54:35 字數 962 閱讀 3567

這道題目資料很弱不保證我的程式完全正確qaq。

另外這道題目在2023年集訓隊**中有提到。以下是窩的口胡》.<:

對於乙個點(x0,y0)和乙個圓心為(x,y)的圓,顯然當(x0-x)^2+(y0-y)^2<=x^2+y^2時點在圓內,化簡得到:2y·y0>=-2x·x0+x0^2+y0^2,然後可以把2y0除到右邊去,當y0>0時有:

y>=(-x0/y0)x+(x0^2+y0^2)/2y0

顯然這是乙個半平面交的形式,因此圓心(x,y)需要在直線y=(-x0/y0)x+(x0^2+y0^2)/2y0的上面。要讓所有的圓心都滿足這個條件,我們可以對所有的圓心求乙個下凸殼,然後到這個下凸殼上面去二分查詢斜率最接近-x0/y0的然後只要這個圓心滿足條件則所有的圓心滿足條件。

當y0<0時同理,維護乙個上凸殼即可。

ac**如下:

#include#include#include#include#define sqr(x) (x)*(x)

#define inf 1e40

#define eps 1e-10

#define n 500005

using namespace std;

int n,cnt,q1[n],q2[n]; struct nodea[n],b[n]; bool ok[n];

bool cmp(node u,node v)

int main() else flag=1;

if (a[i].y) a[i].k=-a[i].x/a[i].y; else a[i].k=inf;

a[i].id=i;

} sort(a+1,a+n+1,cmp); solve(1,n);

for (i=1; i<=cnt; i++) puts(ok[i]?"yes":"no");

return 0;

}

by lych

2016.4.16

BZOJ2961 共點圓 CDQ分治

bzoj 其實就是推一下圓的式子 長成這個樣子 假設要查詢的點是 x,y 某個圓心是 p,q x p 2 y q 2 leq p 2 q 2 變成 fracp frac leq q 那麼乙個點合法就要對所有圓心都滿足上面這個式子 很明顯拿斜率截就好啦 然後cdq維護上下凸包 附 cdq維護凸包過程 ...

BZOJ 2961 共點圓 CDQ分治 凸包

題目大意 給定平面,多次插入點和圓,每次插入點時詢問當前插入的點是否在之前插入的所有圓中並且至少在乙個圓中 直接用資料結構維護這些點和圓不是很好寫,我們考慮cdq分治 對於每層分治,我們需要對於 mid 1,r 中的每個點求出 l,mid 中是否所有的圓都覆蓋了這個點 設點的座標為 x0,y0 那麼...

BZOJ2961 共點圓 cdq分治 凸包

bzoj傳送門 首先考慮乙個點 x 0,y 0 什麼時候在乙個圓 x 1,y 1,sqrt 內 顯然有 x 12 y 12 geq x 0 x 1 2 y 0 y 1 2 化簡 2x 0x 1 2y 0y 1 geq x 02 y 02 所有含 x 1,y 1 的項挪到同一邊,除掉乙個 2y 0 假...