直接写的裸的半平面交,已经有点背不过模板了。。。

   这题卡精度,要用long double ,esp设1e-20。。。

   

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<vector>
#define N 20005
#define double long double
#define inf 1e100
using namespace std;
int n;
const double eps = 1e-20;
struct point//  点&向量
{double x,y; point(){};point(double _x,double _y){x=_x;y=_y;}
}p[N];
// 点减点=向量
point operator - (point a,point b){return point(a.x-b.x,a.y-b.y);}
// 向量+向量=向量 点+向量=点
point operator + (point a,point b){return point(a.x+b.x,a.y+b.y);}
// 向量数乘
point operator * (point a,double b){return point(a.x*b,a.y*b);}
point operator / (point a,double b){return point(a.x/b,a.y/b);}
// 叉积
double cross(point a,point b){return a.x*b.y-a.y*b.x;}
int dcmp(double x)
{if(max(x,-x)<eps)return 0;if(x<0)return -1;return 1;
}
struct line
{point p,v;  int id;double ang;line(){};line(point pp,point vv,int _id){id=_id;p=pp;v=vv;ang=atan2(v.y,v.x);}friend bool operator < (line aa,line bb){return aa.ang<bb.ang;}
}lines[N],dep[N*2];int cnt;
point getpoint(line a,line b)
{point u=a.p-b.p;double t=cross(b.v,u)/cross(a.v,b.v);return a.p+a.v*t;
}
bool onright(point a,line b)
{return cross(b.v,a-b.p)<0;
}
int tot,h,t;
void insert(line l)
{while(h<t&&onright(p[t-1],l))t--;while(h<t&&onright(p[h],l))h++;dep[++t]=l;if(h<t&&dcmp(dep[t].ang-dep[t-1].ang)==0){t--;if(onright(dep[t].p,l))dep[t]=l;}if(h<t)p[t-1]=getpoint(dep[t],dep[t-1]);
}
void half()
{h=1;t=0;for(int i=1;i<=cnt;i++){insert(lines[i]);}while(h<t&&onright(p[t-1],dep[h]))t--;return ;
}
int v[N],pos[N];
int tt[N];
map<pair<int,int>,int>mp;
vector<int>ss[N];
int main()
{
//  freopen("in.txt","r",stdin);lines[++cnt]=line(point(inf,inf),point(-1,0),0);lines[++cnt]=line(point(0,inf),point(0,-1),0);lines[++cnt]=line(point(0,0),point(1,0),0);lines[++cnt]=line(point(inf,0),point(0,1),0);// 保证答案为空集或一个凸多边形 scanf("%d",&n);int mx=0;int ans=0;for(int i=1;i<=n;i++)scanf("%d",&pos[i]),mx=max(mx,pos[i]);for(int i=1;i<=n;i++)scanf("%d",&v[i]);for(int i=1;i<=n;i++){
//      if(i==6501){cout<<pos[i]<<' '<<v[i]<<endl;}if(pos[i]==mx)tt[++ans]=i;if(mp.find(make_pair(pos[i],v[i]))!=mp.end())ss[mp[make_pair(pos[i],v[i])]].push_back(i);else mp[make_pair(pos[i],v[i])]=i,lines[++cnt]=line(point(0,(double)pos[i]),point(1.0,(double)v[i]),i);}sort(lines+1,lines+cnt+1);half();for(int i=h;i<=t;i++){if(dep[i].id!=0){int ttt=dep[i].id;if(pos[ttt]!=mx)tt[++ans]=ttt;for(int j=0;j<ss[ttt].size();j++){if(pos[ss[ttt][j]]!=mx){tt[++ans]=ss[ttt][j];}}}}printf("%d\n",ans);sort(tt+1,tt+ans+1);for(int i=1;i<ans;i++)printf("%d ",tt[i]);printf("%d",tt[ans]);return 0;
}

转载于:https://www.cnblogs.com/ezyzy/p/6441454.html

bzoj 3190 赛车 半平面交相关推荐

  1. bzoj3190 [JLOI2013]赛车 半平面交

    思路和求凸包有点像 首先根据初始位置排序,然后同位置按斜率升序 然后加一条直线就暴力找就可以了(可以二分) 存每条直线的选取区间,然后由于有效的斜率单增,所以若覆盖了就是最后一个 要注意多条直线交于区 ...

  2. BZOJ 1038: [ZJOI2008]瞭望塔 半平面交

    Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们 将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1 ...

  3. BZOJ 1829 [Usaco2010 Mar]starc星际争霸 ——半平面交

    发现最终的结果只和$s1$,$s2$,$s3$之间的比例有关. 所以直接令$s3=1$ 然后就变成了两个变量,然后求一次半平面交. 对于每一个询问所属的直线,看看半平面在它的那一侧,或者相交就可以判断 ...

  4. 【kuangbin专题】计算几何_半平面交

    1.poj3335 Rotating Scoreboard 传送:http://poj.org/problem?id=3335 题意:就是有个球场,球场的形状是个凸多边形,然后观众是坐在多边形的边上的 ...

  5. poj3335 半平面交

    题意:给出一多边形.判断多边形是否存在一点,使得多边形边界上的所有点都能看见该点. sol:在纸上随手画画就可以找出规律:按逆时针顺序连接所有点.然后找出这些line的半平面交. 题中给出的点已经按顺 ...

  6. 计算几何学习之半平面交

    首先解决问题:什么是半平面? 顾名思义,半平面就是指平面的一半,我们知道,一条直线可以将平面分为两个部分,那么这两个部分就叫做两个半平面. 然后,半平面怎么表示呢? 二维坐标系下,直线可以表示为ax ...

  7. [BZOJ2033][清橙A1215][2009国家集训队]大灾变-半平面交

    大灾变 Description 艾泽拉斯世界经历一场亘古未有的地震过后,大地和海洋被完全撕裂,旧大陆残缺不全.联盟和部落各种族的居民们被迫离开了世代居住的家园,来寻找新的生存空间.原本平坦的陆地上现在 ...

  8. 【POJ1474】监控摄像头 半平面交

    题目描述 一个著名的仓库管理公司SERKOI 请你为其安装一套闭路监视系统,由于SERKOI 财力有限,每个房间只能安装一台摄像机,不过其镜头可以向任何方向转换. 请你写一个程序,对于给定的房间示意图 ...

  9. [BZOJ1038]ZJOI2008瞭望塔|半平面交

    考虑某个村庄可以被看见的区域,发现一条线段的上方就是可以看见端点的区域,那就把所有线段扔进去做半平面交,不要忘记了要加上两条左右边界..求出来之后发现答案要么是某个村庄往上到半平面交的一段距离,要么是 ...

最新文章

  1. leetcode381. Insert Delete GetRandom O(1) - Duplicates allowed
  2. C语言编写Scheme解释器,C语言编写logo语言解释器 ,求高手指导
  3. 消息中间件系列四:RabbitMQ与Spring集成
  4. python之元组操作
  5. Linux 天翼3G上网
  6. 大数据思维的十大核心原理
  7. 高通工具QXDM,QCAT和QPST
  8. 戴着镣铐与狼共舞!深度解读新势力造车迷局
  9. 华为认证: 高级redhat例题及答案
  10. Files的常用方法都有哪些?
  11. wrf模式计算机配置,用WRF模型进行气象模拟入门(2)——WPS的配置与使用
  12. NDIS(NDIS开发详解)
  13. mac系统共享服务器,mac 链接共享服务器
  14. 区块链游戏为何如此火?大概是因为投机者和“韭菜”太多
  15. ASR6500S低功耗LoRa+射频前端LPWAN应用芯片
  16. 性能调优攻略——来自酷壳陈皓
  17. 好的网站内容文章是网站发展的动力
  18. 加密流量分析-4.加密协议分析
  19. 端口存活判断(TCP connect、TCP SYN、TCP FIN和UDP的区别)
  20. 【翻译】在极度不确定的时期追求组织的复原力

热门文章

  1. HDUOJ--汉诺塔II
  2. javascript简易缓动插件
  3. 从“做什么”到“怎么做”,说说一只蚊子
  4. 个性化推荐算法-协同过滤
  5. c++中大矩阵乘法计算的效率问题
  6. java8 构造函数引用_java8新特性之方法引用与构造器引用
  7. Unitest框架的使用(四)HTMLTestRunner输出测试报告
  8. “北京链安”近日更名为“中科链安”
  9. SAP License:PS模块WBS预算更改
  10. 商城前后端原型、商城prd文档、商城后台管理系统、商城app文档、电商需求文档、限时秒杀、电商平台、促销助力、拼团抽奖、电商文档、prd文档、电商前后端原型、电商原型、Axure电商系统、rp原型