满足条件的一定是在凸包内的,直接判断

恬不知耻的加了特判,2333

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 50050
using namespace std;
int n,ss[N],top,topa,topb,ans1,ans2;
bool bo=0;
struct point{
double x,y;
}a[N],b[N],o,p[N];
double operator * (point a,point b){return a.x*b.y-b.x*a.y;}
point operator - (point a,point b){return (point){a.x-b.x,a.y-b.y};}
double dis(point a,point b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
bool operator < (point a,point b){
double s=(a-o)*(b-o);
if(s==0) return dis(a,o)<dis(b,o);
return s>0;
}
void graham(point *gy){
ss[++top]=1;
for(int i=2;i<=n;i++){
while(top>1&&(gy[i]-gy[ss[top-1]])*(gy[ss[top]]-gy[ss[top-1]])>0) top--;
ss[++top]=i;
}
}
bool checka(point b){
int l=1,r=topa,mid;
while(l<=r){
mid=(l+r)>>1;
double a1=(a[ss[mid]]-a[ss[1]])*(b-a[ss[1]]);
double a2=(a[ss[mid+1]]-a[ss[1]])*(b-a[ss[1]]);
if(a1>=0&&a2<=0){
if((a[ss[mid+1]]-a[ss[mid]])*(b-a[ss[mid]])>=0) return 1;
return 0;
}
else{
if(a1<0) r=mid-1;
else l=mid+1;
}
}
return 0;
}
bool checkb(point a){
int l=topa+1,r=topb,mid;
while(l<=r){
mid=(l+r)>>1;
double a1=(b[ss[mid]]-b[ss[topa+1]])*(a-b[ss[topa+1]]);
double a2=(b[ss[mid+1]]-b[ss[topa+1]])*(a-b[ss[topa+1]]);
if(a1>=0&&a2<=0){
if((b[ss[mid+1]]-b[ss[mid]])*(a-b[ss[mid]])>=0) return 1;
return 0;
}
else{
if(a1<0) r=mid-1;
else l=mid+1;
}
}
return 0;
}
int main()
{
freopen("curling.in","r",stdin);
freopen("curling.out","w",stdout);
scanf("%d",&n);
int yx=1;
for(int i=1;i<=n;i++){
scanf("%lf%lf",&a[i].x,&a[i].y);
if((a[i].x<a[yx].x)||(a[i].x==a[yx].x&&a[i].y<a[yx].y))yx=i;
if(a[i].x!=0) bo=1;
}
o=a[yx]; swap(a[1],a[yx]);
sort(a+2,a+n+1);
//for(int i=1;i<=n;i++)p[i]=a[i];
graham(a); topa=top;
yx=1;
for(int i=1;i<=n;i++){
scanf("%lf%lf",&b[i].x,&b[i].y);
if((b[i].x<b[yx].x)||(b[i].x==b[yx].x&&b[i].y<b[yx].y))yx=i;
if(b[i].x!=0) bo=1;
}
if(!bo){
printf("%d %d\n",n-1,n-1);
return 0;
}
o=b[yx]; swap(b[1],b[yx]);
sort(b+2,b+n+1);
graham(b); topb=top;
for(int i=1;i<=n;i++)
if(checka(b[i]))
ans1++;
for(int i=1;i<=n;i++)
if(checkb(a[i]))
ans2++;
printf("%d %d\n",ans1,ans2);
return 0;
}

最新文章

  1. 同步降压DC-DC转换IC——XC9264
  2. php性能剖析的几款软件
  3. 一款全兼容的播放器 videojs
  4. C#的数组
  5. js-JavaScript高级程序设计学习笔记6
  6. Power Strings 分类: POJ 串 2015-07-31 19:05 8人阅读 评论(0) 收藏
  7. delphi快捷键
  8. Android Service实时向Activity传递数据
  9. DS18B20 for STM32 源代码 【worldsing笔记】
  10. 关于js跨域
  11. 正在搞用web.py做的通讯录
  12. resultMap之collection聚集
  13. iOS中的base64加密
  14. IOS CrackMe 破解学习
  15. Android多线程下安全访问数据库
  16. 视频云SDK iOS持续集成项目实践
  17. 大区间素数筛选(POJ 2689)
  18. 【转】globk中的卫星轨道约束
  19. 新版MATERIAL DESIGN 官方动效指南(二)
  20. Python的易错点

热门文章

  1. Java多线程 阻塞队列和并发集合
  2. mybatis源码解读(二)——构建Configuration对象
  3. SystemJS to Webpack – Before You Begin
  4. SQL Server复制表结构和表数据生成新表的语句
  5. 推荐两个国外公共CDN服务
  6. Mysql研磨之InnoDB行锁模式
  7. 手把手教你全家桶之React(二)
  8. 使用WSL连接Docker for Windows
  9. python 编码形式简单入门
  10. 115个Java面试题和答案——终极列表(下)【转】