其实并不算标准半平面交?但是思路差不多

先按照斜率排序,然后用栈维护凸壳,每遇到重斜率或a[i],s[top-1]交点的x轴在s[top],s[top-1]交点左侧,则说明s[top]被a[i],s[top-1]覆盖,弹栈即可;

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=50005;
const double eps=1e-8;
int n,top;
bool v[N];
struct qwe
{
double a,b;
int id;
}a[N],s[N];
int sgn(double x)
{
return x<-eps?-1:x>eps;
}
bool cmp(const qwe &a,const qwe &b)
{
return sgn(a.a-b.a)==0&&a.b<b.b||a.a<b.a;
}
double jdy(qwe a,qwe b)
{
return (b.b-a.b)/(a.a-b.a);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lf%lf",&a[i].a,&a[i].b),a[i].id=i;
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
{
// while(top>1&&(sgn(jdy(s[top],s[top-1])-jdy(a[i],s[top-1]))>=0||sgn(s[top].a-a[i].a)==0))
// top--;
while(top)
{
if(sgn(s[top].a-a[i].a)==0)
top--;
else if(top>1&&jdy(a[i],s[top-1])<=jdy(s[top],s[top-1]))
top--;
else
break;
}
s[++top]=a[i];
}
for(int i=1;i<=top;i++)
v[s[i].id]=1;
for(int i=1;i<=n;i++)
if(v[i])
printf("%d ",i);
return 0;
}

最新文章

  1. LINUX 下Open cv练习使用小记(1)
  2. 【转】关于LWF——线性工作流
  3. thinkphp关联查询
  4. Winform上传下载文件代码
  5. javascript删除目标标签
  6. C# 网上收集的一些所谓的开源项目
  7. 限定textbox中只能输入数字的小方法
  8. Centos下的GitLab的安装汉化和数据备份以及管理员密码重置
  9. Asp.net core 学习笔记 ( Data protection )
  10. Qt532.QString_填充字符
  11. 学习笔记之GenFu
  12. Https如何确保传输安全的
  13. JNDI 在 J2EE 中的角色
  14. rabbitmq之后台管理和用户设置(三)
  15. Git的配置和使用
  16. Unix网络编程第三版源码编译
  17. 深入浅出SharePoint2010——请假系统无代码篇之数据框架设计
  18. 一道关于数据库(经典父子级 ID 关联)更新题,大家帮忙想想还有其它解决思路没有?
  19. Jsp 的映射
  20. master分支合并

热门文章

  1. Back弹出AlertDialog
  2. poj2773求第K个与m互质的数
  3. POJ 1704 Georgia and Bob【博弈】
  4. AtCoder Regular Contest 091&amp;092
  5. 使用python分析解压zip、jar包等
  6. Native进程之Trace原理(转)——可直接输出某进程的栈帧——debuggerd
  7. 阿里云 oss 小文件上传进度显示
  8. C++对象模型——解构语意学(第五章)
  9. How to Use SFTP ?
  10. the first week study