ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

luogu P3194 [HNOI2008]水平可见直线 |单调栈

2020-05-26 20:05:48  阅读:223  来源: 互联网

标签:node 直线 P3194 int luogu db t1 HNOI2008 include


题目描述

在 \(x-y\) 直角坐标平面上有 \(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| \le 500000\)),且 \(n\) 条直线两两不重合,求出所有可见的直线。

输入格式

第一行为 \(N\) (\(0<N<50000\)),接下来的 \(N\) 行输入 \(A_i,B_i\)​

输出格式

从小到大输出可见直线的编号,两两中间用空格隔开,最后一个数字后面也必须有个空格。


#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=5e4+10;
#define int long long
#define db double
inline void read(int&x){
    x = 0;char c;int sign = 1;
    do{ c = getchar(); if(c == '-') sign = -1; }while(c < '0' || c>'9');
    do{ x = x*10 + c -'0';c = getchar(); }while(c <= '9' && c >= '0');
    x *= sign;
}
struct node{
	int A,B,id;	
}e[N];
const bool cmp(node t1,node t2){
	return (t1.A^t2.A) ? t1.A<t2.A : t1.B>t2.B ;
}
inline db sol(int i,int j){return (db)(e[i].B-e[j].B)/(db)(e[j].A-e[i].A);}
int n,st[N],ans[N],top;
signed main(){
	read(n);
	for(int i=1;i<=n;i++)read(e[i].A),read(e[i].B),e[i].id=i;
	sort(e+1,e+1+n,cmp);
	for(int i=1;i<=n;i++){
		if(e[i].A==e[i-1].A&&i!=1)continue;
		while(top>1&&sol(st[top],i)<=sol(st[top],st[top-1]))top--;
		st[++top]=i;
		ans[top]=e[i].id;
	}
	sort(ans+1,ans+1+top);
	for(int i=1;i<=top;i++)printf("%lld ",ans[i]);
}

标签:node,直线,P3194,int,luogu,db,t1,HNOI2008,include
来源: https://www.cnblogs.com/naruto-mzx/p/12968331.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有