BZOJ4140 : 共点圆加强版】的更多相关文章

假设当前询问点为$(A,B)$,那么它在一个以$(x,y)$为圆心的圆里需要满足: $(x-A)^2+(y-B)^2\leq x^2+y^2$ $2Ax+2By\geq A^2+B^2$ 等价于询问所有圆心与$(2A,2B)$的点积的最小值是否小于$A^2+B^2$. 考虑将修改操作二进制分组,分成$O(\log n)$段连续的修改区间,每一段建立上下凸壳维护,查询时在凸壳上三分. 时间复杂度$O(n\log^2n)$,常数很小. #include<cstdio> #include<al…
[BZOJ4140]共点圆加强版(二进制分组) 题面 BZOJ 题解 我卡精度卡了一天.... 之前不强制在线的做法是\(CDQ\)分治,维护一个凸壳就好了. 现在改成二进制分组,每次重建凸壳就好了.. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include&…
题目描述 在平面直角坐标系中,Wayne需要你完成n次操作,操作只有两种: 1.0 x y.表示在坐标系中加入一个以(x, y)为圆心且过原点的圆. 2.1 x y.表示询问点(x, y)是否在所有已加入的圆的内部(含圆周),且至少在一个圆内部(含圆周). 为了减少你的工作量,题目保证圆心严格在x轴上方(纵坐标为正),且横坐标非零. 输入格式 第1行一个整数n. 接下来n行,每行第一个数是0或1,分别表示两种操作. 接着有两个实数x和y,具体意义见题面. 输出格式 对于每个询问操作,如果点在所有…
[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\), 即这个直线…
好久没发了 CDQ分治,具体做法见XHR的论文… /************************************************************** Problem: 2961 User: zhuohan123 Language: C++ Result: Accepted Time:5060 ms Memory:41704 kb ****************************************************************/ #inc…
题面 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…
题解: 比较水的一道题 首先我们化简一下式子发现是维护xxo+yyo的最值 显然是用凸包来做 我们可以直接用支持插入删除的凸包 也是nlogn的 因为没有强制在线,我们也可以cdq,考虑前面一半对答案的影响,再考虑后面的 时间复杂度nlog^2n 后面这道强制在线当然可以直接平衡树维护 但是有一种神奇的方法叫做二进制分组 也是比较好理解的 就是在不断重构 时间复杂度 nlog^3n 注意一下,运用cdq分治和二进制分组的前提是 修改操作互不影响 代码:…
/* 可以发现可行的圆心相对于我们要查询的点是在一个半平面上, 然后我们要做的就是动态维护凸壳然后用这个半平面去切它 看看是否是在合法的那一面 然后cdq分治就可以了 代码基本是抄的, */ #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<iostream> #include<cmath> #define ll long l…
http://www.lydsy.com/JudgeOnline/problem.php?id=2961 (题目链接) 题意 按照一定的顺序给出一些圆和一些点,对于每一个点问是否在所有圆内. Solution 我算是明白计算几何题是有多蛋疼了. 圆包含点$(x_0,y_0)$的条件:$$x*x+y*y>=(x-x_0)*(x-x_0)+(y-y_0)*(y-y_0)$$ $$-2x_0+x_0^2+y_0^2<=2y_0y$$ 题目只说圆心的纵坐标大于$0$,气的我吐出一口老血.所以根据$y_…
更新:此题我的代码设置eps=1e-8会WA,现在改为1e-9貌似T了 此题网上的大部分做法是cdq分治+凸包,然而我觉得太烦了,于是自己口胡了一个k-d树做法: 加入一个圆$(x,y)$,直接在k-d树上加入这个点即可,注意要打rebuild否则会T. 查询一个点$(x_0,y_0)$是否在所有的圆上时: 我们设当前需要判断一个圆$(x,y)$是否覆盖该点,通过简单的分析,可以列出以下式子: $(x-x_0)^2+(y-y_0)^2≤x_0^2+y_0^2$ 我们不妨设$y_0>0$通过简单变…