bzoj 2961 共点圆 cdq+凸包+三分】的更多相关文章

题目大意 两种操作 1)插入一个过原点的圆 2)询问一个点是否在所有的圆中 分析 在圆中则在半径范围内 设圆心 \(x,y\) 查询点\(x_0,y_0\) 则\(\sqrt{(x-x_0)^2+(y-y_0)^2} <= \sqrt{x^2+y^2}\) 解得\(2x_0 * x+2y_0 *y -(x_0^2+y_0^2)>=0\) x,y 为变量 是个半平面的式子 题意变成 1)插入一个点 2)询问是否所有点都在半平面内 插入互不干扰 点都在半平面内当且仅当凸包在半平面内 cdq,维护上…
题面 BZOJ传送门 思路 首先考虑一个点$(x_0,y_0)$什么时候在一个圆$(x_1,y_1,\sqrt{x_1^2+y_1^2})$内 显然有:$x_1^2+y_1^2\geq (x_0-x_1)^2+(y_0-y_1)^2$ 化简:$2x_0x_1+2y_0y_1\geq x_0^2+y_0^2$ 所有含$x_1,y_1$的项挪到同一边,除掉一个$2y_0$(假设它是正的),得到: $y_1\geq -\frac{x_0}{y_0}x_1+\frac{x_0^2+y_0^2}{2y_0…
题面 bzoj 其实就是推一下圆的式子 长成这个样子 假设要查询的点是(x, y) 某个圆心是(p, q) \((x - p)^2 + (y - q)^2 \leq p^2 + q^2\) 变成 \(-\frac{2x}{2y}p + \frac{x^2+y^2}{2y} \leq q\) 那么一个点合法就要对所有圆心都满足上面这个式子 很明显拿斜率截就好啦 然后cdq维护上下凸包 附:cdq维护凸包过程 void cdq(int L, int R){ if(L == R) return ; i…
[BZOJ2961]共点圆(CDQ分治) 题面 BZOJ 题解 设询问点\((x,y)\),圆心是\((X,Y)\) 那么如果点在园内的话就需要满足 \((X-x)^2+(Y-y)^2\le X^2+Y^2\) 拆开之后就变成了 \(x^2+y^2-2xX\le 2yY\) 除过去就是\(-\frac{x}{y}X+\frac{x^2+y^2}{2y}\le Y\) 显然左边是一个直线,那么,这个式子的含义就是, 对于任意\((X,Y)\),在\(X\)处的函数值都要小于\(Y\), 即这个直线…
题目大意 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y)点积的最大值是多少.如果当前是空集输出0 分析 按时间线建线段树 大致同bzoj 3533 [Sdoi2014]向量集 同样的,我们不必要搞出包含询问所在时间点的所有向量再求凸包三分 一个时间点的答案就是它线段树上所有祖先的答案的最大值 复杂度一样是\(n\log^2n\) solution 没写 挖坑…
题目大意 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); "Q x y l r (|x|,|y| < =10^8,1 < =L < =R < =T,其中T为已经加入的向量个数)询问第L个到第R个加入的向量与向量(x,y)的点积的最大值. 集合初始时为空. 分析 题目中相当于给出一堆点\((z,w)\) 询问点\(x,y\) 求\(maximize(ans=xz+yw)\) \(\fr…
[BZOJ4140]共点圆加强版(二进制分组) 题面 BZOJ 题解 我卡精度卡了一天.... 之前不强制在线的做法是\(CDQ\)分治,维护一个凸壳就好了. 现在改成二进制分组,每次重建凸壳就好了.. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include&…
题面 传送门 题解 这题解法真是多啊--据说可以圆反演转化为动态插入半平面并判断给定点是否在半平面交中,或者化一下改成给定点判断是否所有点都在某一个半平面内-- 鉴于圆反演我也不会,这里讲一下直接推的好了 如果一个圆的圆心是\((a,b)\),询问点是\((x,y)\),那么这个询问点在圆心上的条件就是 \[ \begin{aligned} (x-a)^2+(y-b)^2\le a^2+b^2 \\ x^2+y^2\le 2ax+2by \\ b\ge -\frac{x}{y}a+\frac{x…
/* 可以发现可行的圆心相对于我们要查询的点是在一个半平面上, 然后我们要做的就是动态维护凸壳然后用这个半平面去切它 看看是否是在合法的那一面 然后cdq分治就可以了 代码基本是抄的, */ #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<iostream> #include<cmath> #define ll long l…
Description 传送门 Solution 考虑对于每一个点: 设圆的坐标为(x,y),点的坐标为(x0,y0).依题意得,当一个点在圆里,需要满足(x-x0)2+(y-y0)2<=x2+y2. 化简得x02+y02<=2x0*x+2y0*y. 当y0>0,x*(-x0/y0)+0.5y0+x02/(2*y0)<=y,这是一个半平面的式子:当y0<0时同理,但是要变号. 所以对于某个点(x0,y0),我们构造出在它前面所有圆心的凸包.凸包应分为上下. 通过以上式子我们可…