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<algorithm>
#define N 500010
int n,m,op,t,q[30],r1[30],r2[30],flag;double A,B,C,D;
struct P{double x,y;}a[N],b[N],q1[N],q2[N];
inline bool cmp1(const P&a,const P&b){return a.x==b.x?a.y>b.y:a.x<b.x;}
inline bool cmp2(const P&a,const P&b){return a.x==b.x?a.y<b.y:a.x<b.x;}
inline void update(){
while(t&&m-q[t]==q[t]-q[t-1])t--;q[++t]=m;
int i,cnt=0,L=q[t-1]+1,R;
for(i=L;i<=m;i++)b[cnt++]=a[i];
std::sort(b,b+cnt,cmp1);
for(q1[R=L]=b[0],i=1;i<cnt;q1[++R]=b[i++])while(R>L&&(q1[R].y-q1[R-1].y)*(b[i].x-q1[R].x)<=(b[i].y-q1[R].y)*(q1[R].x-q1[R-1].x))R--;
r1[t]=R;
std::sort(b,b+cnt,cmp2);
for(q2[R=L]=b[0],i=1;i<cnt;q2[++R]=b[i++])while(R>L&&(q2[R].y-q2[R-1].y)*(b[i].x-q2[R].x)>=(b[i].y-q2[R].y)*(q2[R].x-q2[R-1].x))R--;
r2[t]=R;
}
inline double mul(const P&b){return A*b.x+B*b.y;}
inline void ask1(int l,int r){
int m1,m2;double s1,s2;
while(l<=r){
int len=(r-l)/3;
if((s1=mul(q1[m1=l+len]))<(s2=mul(q1[m2=r-len]))){
if(s1<C){flag=1;return;}
r=m2-1;
}else{
if(s2<C){flag=1;return;}
l=m1+1;
}
}
}
inline void ask2(int l,int r){
int m1,m2;double s1,s2;
while(l<=r){
int len=(r-l)/3;
if((s1=mul(q2[m1=l+len]))<(s2=mul(q2[m2=r-len]))){
if(s1<C){flag=1;return;}
r=m2-1;
}else{
if(s2<C){flag=1;return;}
l=m1+1;
}
}
}
inline void ask(){
flag=0;
for(int i=1;i<=t;i++){
if(B<0)ask1(q[i-1]+1,r1[i]);else ask2(q[i-1]+1,r2[i]);
if(flag)return;
}
}
int main(){
scanf("%d",&n);
while(n--){
scanf("%d%lf%lf",&op,&A,&B);A+=D,B+=D;
if(!op)a[++m].x=A,a[m].y=B,update();
else{
if(!m){puts("No");continue;}
C=A*A+B*B,A+=A,B+=B,ask();
if(flag)puts("No");else puts("Yes"),D++;
}
}
return 0;
}
BZOJ4140 : 共点圆加强版的更多相关文章
- 【BZOJ4140】共点圆加强版(二进制分组)
[BZOJ4140]共点圆加强版(二进制分组) 题面 BZOJ 题解 我卡精度卡了一天.... 之前不强制在线的做法是\(CDQ\)分治,维护一个凸壳就好了. 现在改成二进制分组,每次重建凸壳就好了. ...
- bzoj2961&&bzoj4140 共点圆
题目描述 在平面直角坐标系中,Wayne需要你完成n次操作,操作只有两种: 1.0 x y.表示在坐标系中加入一个以(x, y)为圆心且过原点的圆. 2.1 x y.表示询问点(x, y)是否在所有已 ...
- 【BZOJ2961】共点圆(CDQ分治)
[BZOJ2961]共点圆(CDQ分治) 题面 BZOJ 题解 设询问点\((x,y)\),圆心是\((X,Y)\) 那么如果点在园内的话就需要满足 \((X-x)^2+(Y-y)^2\le X^2+ ...
- BZOJ2961: 共点圆
好久没发了 CDQ分治,具体做法见XHR的论文… /************************************************************** Problem: 29 ...
- BZOJ2961 共点圆[CDQ分治]
题面 bzoj 其实就是推一下圆的式子 长成这个样子 假设要查询的点是(x, y) 某个圆心是(p, q) \((x - p)^2 + (y - q)^2 \leq p^2 + q^2\) 变成 \( ...
- bzoj2961 共点圆 bzoj 4140
题解: 比较水的一道题 首先我们化简一下式子发现是维护xxo+yyo的最值 显然是用凸包来做 我们可以直接用支持插入删除的凸包 也是nlogn的 因为没有强制在线,我们也可以cdq,考虑前面一半对答案 ...
- bzoj2961 共点圆 (CDQ分治, 凸包)
/* 可以发现可行的圆心相对于我们要查询的点是在一个半平面上, 然后我们要做的就是动态维护凸壳然后用这个半平面去切它 看看是否是在合法的那一面 然后cdq分治就可以了 代码基本是抄的, */ #inc ...
- 【bzoj2961】 共点圆
http://www.lydsy.com/JudgeOnline/problem.php?id=2961 (题目链接) 题意 按照一定的顺序给出一些圆和一些点,对于每一个点问是否在所有圆内. Solu ...
- 【bzoj2961】共点圆 k-d树
更新:此题我的代码设置eps=1e-8会WA,现在改为1e-9貌似T了 此题网上的大部分做法是cdq分治+凸包,然而我觉得太烦了,于是自己口胡了一个k-d树做法: 加入一个圆$(x,y)$,直接在k- ...
随机推荐
- PHP无限极分类实现
简单版的PHP生成无限极分类代码.其中包括了数据库设计.以及输出分类HTML代码. SQL代码 CREATE TABLE `district` ( `id` int(10) unsigned NOT ...
- Leetcode 之Convert Sorted Array to Binary Search Tree(54)
思路很简单,用二分法,每次选中间的点作为根结点,用左.右结点递归. TreeNode* sortedArrayToBST(vector<int> &num) { return so ...
- DICOM医学图像处理:storescp.exe与storescu.exe源码剖析,学习C-STORE请求
转载:http://blog.csdn.net/zssureqh/article/details/39213817 背景: 上一篇专栏博文中针对PACS终端(或设备终端,如CT设备)与RIS系统之间w ...
- [另开新坑] 算导v3 #26 最大流 翻译
26 最大流 就像我们可以对一个路网构建一个有向图求最短路一样,我们也可以将一个有向图看成是一个"流量网络(flow network)",用它来回答关于流的问题. Just as ...
- PHP编译支持mysqli
PHP编译支持mysqli前提是必须安装mysql直接上命令先进入源码包我的源码包是在/usr/local/php-5.2.1/ext/mysqli这样进入 cd /usr/local/php-5.2 ...
- linux文件分割(将大的日志文件分割成小的)
linux文件分割(将大的日志文件分割成小的) linux下文件分割可以通过split命令来实现,可以指定按行数分割和安大小分割两种模式.Linux下文件合并可以通过cat命令来实现,非常简单. 在L ...
- Java for LeetCode 057 Insert Interval
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...
- codeforces A. Strange Addition 解题报告
题目链接:http://codeforces.com/problemset/problem/305/A 题目意思:给出一个序列,需要从中选择一些数,这些数需要满足:任意的两个数中每一位至少有一个数满足 ...
- hdu 1213 How Many Tables 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 有关系(直接或间接均可)的人就坐在一张桌子,我们要统计的是最少需要的桌子数. 并查集的入门题,什 ...
- 部署django应用
Autor: wangxianlong 2016/7/10 16:17:55 环境: centos 6.5 python 2.7.5 django 1.9 nginx 1.8 selinux diab ...