BZOJ 4140 凸包+二进制分组
思路:
$(x_0-x)^2+(y_0-y)^2<=x^2+y^2$
$y>=(-x_0/y_0)x+(x_0^2+y_0^2)/2y0$
这显然就是凸包了
以一个斜率不断向下(上)走 找到第一个接触到的点
离线可以用cdq分治一发 他左边的判一判是不是都符合在圆内
这不能离线就很难搞了
感觉自己代码能力捉鸡 写棵splay估计要调死
强烈安利二进制分组做法
非常强
在log个凸包上 二分一下斜率 判一判 就好了
//By SiriusRen
#include <bits/stdc++.h>
using namespace std;
const int N=;
const double pi=acos(-),eps=1e-;
int n,op,flg,tot,num,top,rec,size[];
struct Point{double x,y;Point(double X=,double Y=):x(X),y(Y){}}jy,lst[N],q[N];
Point operator-(Point a,Point b){return Point(a.x-b.x,a.y-b.y);}
double operator*(Point a,Point b){return a.x*b.y-a.y*b.x;}
bool operator<(Point a,Point b){return a.x==b.x?a.y<b.y:a.x<b.x;}
bool cmp(Point a,Point b){return (a-lst[])*(b-lst[])>-eps;}
vector<Point>vec[];vector<double>ang[];
void Tubao(){
for(int i=;i<=num;i++)if(lst[i]<lst[])swap(lst[],lst[i]);
sort(lst+,lst++num,cmp),top=;
for(int i=;i<=num;i++){
while(top>&&(lst[i]-q[top])*(q[top]-q[top-])>-eps)top--;
q[++top]=lst[i];
}
}
double A(double x){return x<=-pi/?x+*pi:x;}
void insert(Point p){
vec[++tot].push_back(p),size[tot]=,lst[num=]=p;
while(tot>&&size[tot]==size[tot-]){
for(int i=;i<vec[tot-].size();i++)lst[++num]=vec[tot-][i];
size[tot-]+=size[tot],size[tot]=,vec[tot].clear(),ang[tot].clear(),tot--;
}
Tubao(),vec[tot].clear(),ang[tot].clear();
if(top>){
for(int i=;i<top;i++)vec[tot].push_back(q[i]),ang[tot].push_back(A(atan2(q[i+].y-q[i].y,q[i+].x-q[i].x)));
vec[tot].push_back(q[top]),ang[tot].push_back(A(atan2(q[].y-q[top].y,q[].x-q[top].x)));
}
else vec[tot].push_back(q[]);
}
bool query(){
double angle;
angle=jy.y>?A(atan2(-jy.x,jy.y)):A(atan2(jy.x,-jy.y));
for(int i=;i<=tot;i++){
op=vec[i].size()==?:lower_bound(ang[i].begin(),ang[i].end(),angle)-ang[i].begin();
if(*jy.x*vec[i][op].x+*jy.y*vec[i][op].y-jy.x*jy.x-jy.y*jy.y<eps)return ;
}return ;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%lf%lf",&op,&jy.x,&jy.y),jy.x+=rec,jy.y+=rec;
if(op==)flg=,insert(jy);
else flg&&query()?(puts("Yes"),rec++):puts("No");
}
}
BZOJ 4140 凸包+二进制分组的更多相关文章
- [BZOJ 2989]数列(二进制分组+主席树)
[BZOJ 2989]数列(二进制分组+主席树) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[ ...
- bzoj 4398 福慧双修——二进制分组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 如果枚举1号点走哪些点出去,就从那些点出发跑多源最短路即可.最短路不会重复经过一条边. ...
- bzoj 4398 福慧双修 —— 二进制分组+多起点最短路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 按二进制每一位是 0/1 把 1 号点的儿子分成两组,分别作为起点和终点跑多起点最短路 ...
- 题解 bzoj 4398福慧双修(二进制分组)
二进制分组,算个小技巧 bzoj 4398福慧双修 给一张图,同一条边不同方向权值不同,一条边只能走一次,求从1号点出发再回到1号点的最短路 一开始没注意一条边只能走一次这个限制,打了个从一号点相邻节 ...
- bzoj2961 共点圆 bzoj 4140
题解: 比较水的一道题 首先我们化简一下式子发现是维护xxo+yyo的最值 显然是用凸包来做 我们可以直接用支持插入删除的凸包 也是nlogn的 因为没有强制在线,我们也可以cdq,考虑前面一半对答案 ...
- 【BZOJ3821/UOJ46】玄学(二进制分组,线段树)
[BZOJ3821/UOJ46]玄学(二进制分组,线段树) 题面 BZOJ UOJ 题解 呜,很好的题目啊QwQ. 离线做法大概可以线段树分治,或者直接点记录左右两次操作时的结果,两个除一下就可以直接 ...
- 【BZOJ4140】共点圆加强版(二进制分组)
[BZOJ4140]共点圆加强版(二进制分组) 题面 BZOJ 题解 我卡精度卡了一天.... 之前不强制在线的做法是\(CDQ\)分治,维护一个凸壳就好了. 现在改成二进制分组,每次重建凸壳就好了. ...
- 【BZOJ2989】数列(二进制分组,主席树)
[BZOJ2989]数列(二进制分组,主席树) 题面 BZOJ 权限题啊... Description 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即g ...
- 【Codeforces710F】String Set Queries (强制在线)AC自动机 + 二进制分组
F. String Set Queries time limit per test:3 seconds memory limit per test:768 megabytes input:standa ...
随机推荐
- out对象的使用
out对象的使用 制作人:全心全意 out对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区.在使用out对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的 ...
- python字符串方法replace()简介
今天写replace方法的时候的代码如下: message = "I really like dogs" message.replace('dog','cat') print(me ...
- 08 Python基础数据结构
目录: 1) 列表 2) 元组 3) 字符串 4) bytes 5) bytearray 6) 字典 7) 集合 8) 冻集合 """1. 列表特性2. 创建3. 增加4 ...
- 一位ACMer过来人的心得
http://blog.csdn.net/acm_cxlove/article/details/8079348
- my first emacs custom key binding
(defun comment-this-level () (interactive) (move-beginning-of-line 1) (set-mark-command nil) (fo ...
- 洛谷—— P2658 汽车拉力比赛
https://www.luogu.org/problem/show?pid=2658 题目描述 博艾市将要举行一场汽车拉力比赛. 赛场凹凸不平,所以被描述为M*N的网格来表示海拔高度(1≤ M,N ...
- Linux查看设备信息命令
系统 #查看内核/操作系统/CPU信息 uname -a #查看操作系统版本 head -n 1 /etc/issue #查看CPU信息 cat /proc/cpuinfo #查看计算机名 hostn ...
- Ubuntu 16.04解决在虚拟终端(Ctrl+Alt+F1)下显示菱形中文乱码问题
在安装Ubuntu时,如果默认选择了中文,那么以后进去到虚拟终端就会出现菱形的中文乱码. 其实这个是无解的,但是可以通过以下技巧去实现: 1.把系统转成英文的 sudo gedit /etc/defa ...
- Ubuntu 16.04常用快捷键(转)
注意:在Linux下Win键就是Super键 启动器 Win(长按) 打开启动器,显示快捷键 Win + Tab 通过启动器切换应用程序 Win + 1到9 与点击启动器上的图标效果一样 Win + ...
- css3的高级而有用且很少人知道的属性和样式
1.-webkit-mask 概属性可以给一个元素添加蒙层,蒙层可以是一个渐变或者半透明的png图片,这张png图片的 alpha 为 0 的位置会不显示元素这部分,alpha 为 1 的位置会显示元 ...