bzoj 3190 赛车 半平面交
直接写的裸的半平面交,已经有点背不过模板了。。。
这题卡精度,要用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-;
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 ;
if(x<)return -;
return ;
}
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*];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)<;
}
int tot,h,t;
void insert(line l)
{
while(h<t&&onright(p[t-],l))t--;
while(h<t&&onright(p[h],l))h++;
dep[++t]=l;
if(h<t&&dcmp(dep[t].ang-dep[t-].ang)==)
{
t--;
if(onright(dep[t].p,l))dep[t]=l;
}
if(h<t)p[t-]=getpoint(dep[t],dep[t-]);
}
void half()
{
h=;t=;
for(int i=;i<=cnt;i++)
{
insert(lines[i]);
}
while(h<t&&onright(p[t-],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(-,),);
lines[++cnt]=line(point(,inf),point(,-),);
lines[++cnt]=line(point(,),point(,),);
lines[++cnt]=line(point(inf,),point(,),);
// 保证答案为空集或一个凸多边形
scanf("%d",&n);int mx=;int ans=;
for(int i=;i<=n;i++)scanf("%d",&pos[i]),mx=max(mx,pos[i]);
for(int i=;i<=n;i++)scanf("%d",&v[i]);
for(int i=;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(,(double)pos[i]),point(1.0,(double)v[i]),i);
}
sort(lines+,lines+cnt+);
half();
for(int i=h;i<=t;i++)
{
if(dep[i].id!=)
{
int ttt=dep[i].id;
if(pos[ttt]!=mx)tt[++ans]=ttt;
for(int j=;j<ss[ttt].size();j++)
{
if(pos[ss[ttt][j]]!=mx)
{
tt[++ans]=ss[ttt][j];
}
}
}
}
printf("%d\n",ans);
sort(tt+,tt+ans+);
for(int i=;i<ans;i++)printf("%d ",tt[i]);
printf("%d",tt[ans]);
return ;
}
bzoj 3190 赛车 半平面交的更多相关文章
- bzoj 2732 射箭 半平面交
2732: [HNOI2012]射箭 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2531 Solved: 848[Submit][Status] ...
- bzoj 4445 小凸想跑步 - 半平面交
题目传送门 vjudge的快速通道 bzoj的快速通道 题目大意 问在一个凸多边形内找一个点,连接这个点和所有顶点,使得与0号顶点,1号顶点构成的三角形是最小的概率. 假设点的位置是$(x, y)$, ...
- BZOJ 4445 [Scoi2015]小凸想跑步:半平面交
传送门 题意 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 $ n $ 边形,$ n $ 个顶点 $ P_i $ 按照逆时针从 $ 0 $ 至 $ n-1 $ 编号. ...
- BZOJ 1137: [POI2009]Wsp 岛屿 半平面交
1137: [POI2009]Wsp 岛屿 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 165 Solved: ...
- BZOJ 1829 [Usaco2010 Mar]starc星际争霸 ——半平面交
发现最终的结果只和$s1$,$s2$,$s3$之间的比例有关. 所以直接令$s3=1$ 然后就变成了两个变量,然后求一次半平面交. 对于每一个询问所属的直线,看看半平面在它的那一侧,或者相交就可以判断 ...
- 【BZOJ-4515】游戏 李超线段树 + 树链剖分 + 半平面交
4515: [Sdoi2016]游戏 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 304 Solved: 129[Submit][Status][ ...
- poj3335 半平面交
题意:给出一多边形.判断多边形是否存在一点,使得多边形边界上的所有点都能看见该点. sol:在纸上随手画画就可以找出规律:按逆时针顺序连接所有点.然后找出这些line的半平面交. 题中给出的点已经按顺 ...
- POJ3525 半平面交
题意:求某凸多边形内部离边界最远的点到边界的距离 首先介绍半平面.半平面交的概念: 半平面:对于一条有向直线,它的方向的左手侧就是它所划定的半平面范围.如图所示: 半平面交:多个半平面的交集.有点类似 ...
- POJ 3130 How I Mathematician Wonder What You Are! /POJ 3335 Rotating Scoreboard 初涉半平面交
题意:逆时针给出N个点,求这个多边形是否有核. 思路:半平面交求多边形是否有核.模板题. 定义: 多边形核:多边形的核可以只是一个点,一条直线,但大多数情况下是一个区域(如果是一个区域则必为 ).核内 ...
随机推荐
- python初学者随笔Week2
一.集合 去重,把一个列表变成集合,自动去重 关系测试,测试两组数据的交集,并集,差集关系 集合是无序的 集合的操作: list_1 = [1,4,5,7,3,6,7,9] list_1 = set( ...
- Azure-如何排查应用程序网关返回 HTTP Code 502 或客户端得到应用程序网关响应慢的问题(二)
问题描述 经过如何排查应用程序网关返回 HTTP Code 502 或客户端得到应用程序网关响应慢的问题(一)中的排查步骤,可以判断出是由于 Web 服务器自身问题导致的响应异常. 那么可以在 IIS ...
- 从汉诺塔游戏理解python递归函数
汉诺塔游戏规则: 有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方 图 ...
- python2.7 倒计时
From: http://www.vitostack.com/2016/06/05/python-clock/#more Python公告 Python 发布了一个网站 http://pythoncl ...
- NEWBEE软件团队 人员分配情况及分数获得方式
人员分配: PM:李桐 王骜 dev:王骜 刘垚鹏 安康 林旭鹏 黄新越 test:黄伟龙 李桐 马佐霖 黄新越 注:黄新越为女生,不方便平时的交流,所以任务分配较为灵活,特分在两个组里. 评分 ...
- 始入OO课程的殿堂,初识面向对象的奥妙——OO第一次博客总结
当我满怀期待叩开OO的大门,却发现宝藏藏在层层阻难之后 第一次作业 1.度量分析 >关于第一次作业的metrics图分析没有出现标红的McCabe Cyclomatic Complexity或者 ...
- 树莓派 Raspberry-Pi 折腾系列:系统安装及一些必要的配置
入手树莓派将近一个月了,很折腾,许多资源不好找,也很乱.简单整理一下自己用到的东西,方便以后自己或别人继续折腾. 0. 操作系统下载 树莓派官方 Raspbian 系统下载:http://www.ra ...
- Struts2 核心流程
1.Struts2架构图 这是Struts2官方站点提供的Struts 2 的整体结构. 执行流程图 2.Struts2部分类介绍 这部分从Struts2参考文档中翻译就可以了. ActionM ...
- 利用Hibernate子查询(in) 得到部分字段(实体类的构造函数)
感人= = 终于弄好了 String hql="select new Shop(s.strid,s.shopname,s.tradearea,s.discountinfo,s.beginti ...
- Alpha版本冲刺(七)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...