• 题面描述

    • 在\(xOy\)直角坐标平面上有\(n\)条直线\(L_1,L_2,...,L_n\),若在\(y\)值为正无穷大处往下看,能见到\(L_i\)的某个子线段,则称\(L_i\)为可见的,否则\(L_i\)为被覆盖的.例如,对于直线:\(L_1:y=x; L_2:y=-x; L_3:y=0\)则\(L_1\)和\(L_2\)是可见的,\(L_3\)是被覆盖的.给出\(n\)条直线,表示成\(y=Ax+B\)的形式\((|A|,|B|\leq 5*10^5)\),且\(n\)条直线两两不重合.求出所有可见的直线.
  • 输入格式
    • 第一行为\(N(0 < N < 50000)\),接下来的\(N\)行输入\(A_i,B_i\)
  • 输出格式
    • 从小到大输出可见直线的编号,两两中间用空格隔开,最后一个数字后面也必须有个空格
  • 题解
    • 不难看出该题核心就是对于给定\(n\)条直线,求他们的下凸包
    • 注意有多个\(A_i\)相同的,在压入栈的时候按\(B_i\)从小到大压入,把前面没有被弹出的\(A_x==A_i\)全部弹出
    • 另:前两条直线不能默认直接压进去,因为他们\(A\)可能相等
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN=5e4+5;
const double eps=1e-8;
struct rec{
double a,b;
int id;
} a[MAXN];
int n;
bool cmp(rec a,rec b){ return fabs(a.a-b.a)<eps?a.b<b.b:a.a<b.a; }
int st[MAXN],top;
struct dt{
double x,y;
};
dt dot(int i,int j){
double x=(a[j].b-a[i].b)/(a[i].a-a[j].a);
double y=a[i].a*x+a[i].b;
return (dt){x,y};
}
int ans[MAXN],cnt;
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+n+1,cmp);
for (int i=1;i<=n;i++){
while (top>=1&&fabs(a[st[top]].a-a[i].a)<eps) top--;
while (top>=2&&dot(st[top-1],st[top]).x>=dot(st[top-1],i).x) top--;
st[++top]=i;
}
for (int i=1;i<=top;i++) ans[cnt++]=a[st[i]].id;
sort(ans,ans+cnt);
for (int i=0;i<cnt;i++) printf("%d ",ans[i]);
printf("\n");
return 0;
}

天助自助者

随机推荐

  1. Ajax步骤

    var request = new XMLHttpRequest(); request.open("GET","get.php",ture); request. ...

  2. MVC复杂类型的模型绑定

    1,属性为引用类型(非集合,非数组) //模型1 public class Contact { public string Name { get; set; } public string Phone ...

  3. POJ - 2586 Y2K Accounting Bug (找规律)

    Accounting for Computer Machinists (ACM) has sufferred from the Y2K bug and lost some vital data for ...

  4. kubernetes 1.3管中窥豹- RS(Replica Sets):the next-generation Replication Controller

    前言 kubernates 1.3出了几个新的概念,其中包括deployments,Replica Sets,并且官网称之为是the next-generation Replication Contr ...

  5. 移动端适配video适配

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. django中itsdangerous的用法

    itsdangerous用来解决什么问题,为什么需要用到itsdangerous? 安装命令:pip install itsdangerous 有时候你想向不可信的环境发送一些数据,但如何安全完成这个 ...

  7. 2. Shell编程第二讲

    (1) 条件测试: test   [ 命令 test 或 [ 可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假,则命令的Exit Status为1(注 ...

  8. 安装 CentOs 系统 及 Python 及 Scrapy 框架

    1: 先安装Centos 系统: 为什么选择CentOs系统,而不选择Ubuntu ? 我在Ubuntu上尝试了三次安装 python 和 Scrapy ,结果都没成功,在运维老王的建议下 使用Cen ...

  9. Django template的html明明改了,前端页面居然没有对应变化?!---Django的小坑

    写django的时候,我有个模板的名字叫detail.html,被detail视图函数渲染 因为那个detail写乱了,但是里面有东西要参考,我没删掉它,改名为detail_old.html,又在目录 ...

  10. controller运行springboot项目

    搭建完springboot项目后,新建HelloController.java文件,编写main方法,启动HelloController.java,具体代码如图: 在浏览器访问127.0.0.1:80 ...