[二进制分组] BZOJ4140. 共点圆加强版
来源:互联网 发布:smtp.gmail.com 端口 编辑:程序博客网 时间:2024/05/22 05:05
没做过在线版…
另
就相当于是判断对于所有点
发现这样的点就在下凸包上
二进制分组就相当于把点分成
比如
每次加点的时候新开一个组,如果这个组与前一个组的大小相同就合并这两个组,每次合并暴力重构。
这样每次查询就相当于在log个凸包上二分一下
复杂度
#include <cstdio>#include <iostream>#include <algorithm>#include <vector>#include <cmath>#define fi first#define se secondusing namespace std;typedef pair<double,double> PAR;const int N=500010;const double eps=-1e-7;int q,n,cnt,t;PAR a[N];bool operator <(PAR a,PAR b){ return a.fi<b.fi || (a.fi==b.fi && a.se<b.se);}inline double GetK(PAR y,PAR x){ return (y.se-x.se)/(y.fi-x.fi);}struct PART{ vector<PAR> p,Q1; int tot,qt1; void push(PAR x){ tot++; p.push_back(x); } void clear(){ p.clear(); Q1.clear(); tot=qt1=0; } void build(){ for(int i=0;i<tot;i++) a[i]=p[i]; sort(a,a+tot); qt1=1; Q1.resize(tot+5); Q1[0]=a[0]; for(int i=1;i<tot;i++){ while(qt1>1 && GetK(Q1[qt1-1],Q1[qt1-2])-GetK(a[i],Q1[qt1-1])>=eps) qt1--; Q1[qt1++]=a[i]; } Q1.resize(qt1+5); } PAR query(vector<PAR> Q,int qt,double k){ int l=0,r=qt-1,mid,ret=0; while(l<=r){ mid=l+r>>1; if(mid==0 || k-GetK(Q[mid],Q[mid-1])>eps) l=(ret=mid)+1; else r=mid-1; } //printf("%d\n",ret); return Q[ret]; } bool query(double x,double y){ double k=-x/y,b=(x*x+y*y)/(2*y); /*for(int i=0;i<qt1;i++) printf("%lf %lf\n",Q1[i].fi,Q1[i].se);*/ PAR cur=query(Q1,qt1,k); return 2*x*cur.fi+2*y*cur.se-x*x-y*y>1e-7; }}B[20];inline void Add(double x,double y){ B[++t].push(PAR(x,y)); while(t>1 && B[t].tot==B[t-1].tot){ for(int i=0;i<B[t].tot;i++) B[t-1].push(B[t].p[i]); B[t].clear(); t--; } B[t].build();}inline int Query(double x,double y){ if(t==0) return 0; for(int i=1;i<=t;i++) if(!B[i].query(x,y)) return 0; return 1;}int main(){ scanf("%d",&q); for(int i=1;i<=q;i++){ double x,y; int opt; scanf("%d%lf%lf",&opt,&x,&y); x+=cnt; y+=cnt; if(opt==0) Add(x,y); else puts(Query(x,y)?(cnt++,"Yes"):"No"); } return 0;}
阅读全文
0 0
- [二进制分组] BZOJ4140. 共点圆加强版
- 【BZOJ4140】 共点圆加强版
- bzoj4140共点圆加强版
- [二进制分组] BZOJ 4140 共点圆加强版
- BZOJ 4140: 共点圆加强版 [二进制分组]
- HDU 6166 二进制分组
- 多重背包二进制分组优化
- bzoj2989&4170【二进制分组】【主席树】
- HDU 6166 Senior Pan(SPFA+二进制分组)
- [DP] [二进制分组] 逃亡的准备
- [ AC自动机 二进制分组/阈值 ] HDU4787
- hdu 1059 Dividing(二进制转化优化) 分组背包
- 【从此不怕强制在线】二进制分组学习笔记
- hdu 5445 Food Problem 分组背包,二进制拆分
- [二进制分组+AC自动机] HDU4787 GRE Words Revenge
- codeforces 710f String Set Queries ac自动机 二进制分组
- 【51nod1086】【背包问题 V2】【动态规划】【二进制分组】
- [二进制分组 AC自动机] HDU 4787 GRE Words Revenge
- nginx中的nginx.conf.default配置
- 并发技术_1_Semaphore
- agileone安装登陆报错,localhost重定向次数过多
- Windows 下WAMP环境的搭建
- 170915 逆向-问鼎杯题库(小磊生病了)
- [二进制分组] BZOJ4140. 共点圆加强版
- 测试一下,打扰了!!!!!!
- MyBatis的配置文件
- 九度 题目1162:I Wanna Go Home
- 关于Form_Load和Public Form()那些事
- 最全Pycharm教程(43)——Pycharm扩展功能之UML类图使用
- LINTCODE——交换链表当中两个节点
- 期望与概率
- 八数码问题(hash+bfs)