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 ...
随机推荐
- 67.基于nested object实现博客与评论嵌套关系
1.做一个实验,引出来为什么需要nested object 冗余数据方式的来建模,其实用的就是object类型,我们这里又要引入一种新的object类型,nested object类型 博客,评论,做 ...
- Django基础——ORM字段和字段参数
ORM概念: 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象( 1. 不同的程序员写的SQL水平参差不齐 2. ...
- * format-- set command window output display format
the displayed number may not match the input number due to display format default: 4 decimal syntax: ...
- ebay 如何获取用户token
1. 首先 配置环境加载依赖的ebay SDK 下载地址 https://go.developer.ebay.com/ebay-sdks 需要在本地仓库安装下面的jar mvn install:ins ...
- [luoguP1280] 尼克的任务(DP)
传送门 原本想着 f[i] 表示前 i 个任务的最优答案,但是不好转移 看了题解后,发现是 f[i] 表示前 i 分钟的最优解,看来还是不能死脑筋,思维得活跃,一个思路行不通就换一个思路. 把 f 数 ...
- Codeforces Beta Round #91 (Div. 1 Only) E. Lucky Array
E. Lucky Array Petya loves lucky numbers. Everybody knows that lucky numbers are positive integers w ...
- NYOJ2 括号配对问题
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=1 ...
- A+B Problem IV
描述acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这个问题给解决了. 输入 包含多组测试数据每组数据包含两个正数A,B(可能为小数且位数不大于400) 输出 ...
- 洛谷(cogs 1293/bzoj 1212) P2292 [HNOI2004]L语言
1293. [HNOI2004] L语言 ★★★ 输入文件:language.in 输出文件:language.out 简单对比时间限制:1 s 内存限制:162 MB [题目描述] ...
- something interesting when read docs
When you kill a session with "ALTER SYSTEM KILL SESSION '' ". If the session is performin ...