1007: [HNOI2008]水平可见直线

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 4453  Solved: 1636
[Submit][Status][Discuss]

Description

在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.
    例如,对于直线:
    L1:y=x; L2:y=-x; L3:y=0
    则L1和L2是可见的,L3是被覆盖的.
    给出n条直线,表示成y=Ax+B的形式(|A|,|B|<=500000),且n条直线两两不重合.求出所有可见的直线.

Input

第一行为N(0 < N < 50000),接下来的N行输入Ai,Bi

Output

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

Sample Input

3
-1 0
1 0
0 0

Sample Output

1 2

HINT

 

Source

题解:做的第一道计算几何。。。

要维护的是一个下凸线一样的东西。即从左到右的交点(左)右边的直线是斜率越来越大的。

所以我们可以按斜率从小到大排序后。用一个栈来这样维护。

每次新加一条直线k,设当前栈顶直线为stack[top]=j,栈顶前一条直线为stack[top-1]=i,则若(k,j)的交点在(i,j)交点的左边或重合,则j必是被k与i及之前的直线所完全覆盖的,所以把j pop 出。直到不能再pop为止,再把k加入栈中。

上来忘了unique了,我是个脑残。。。被题目中的任一两线不重合骗了QAQ。。。

还有!!!这种stack一定要写数!组!版!的!

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
using namespace std;
const int maxn=+;const double esp=1e-;
struct line{int id,k,b;line(int _id=,int _k=0.0,int _b=0.0){id=_id;k=_k;b=_b;}}L[maxn],S[maxn];
bool operator<(const line&a,const line&b){return (a.k<b.k)||(a.k==b.k&&a.b>b.b);}
bool operator==(const line&a,const line&b){return a.k==b.k;}
double getx(line&a,line&b){
return (double)(b.b-a.b)/(double)(a.k-b.k);
}
int n,ans[maxn],top=;
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') sig=-;ch=getchar();}
while(isdigit(ch)) x=*x+ch-'',ch=getchar();
return x*=sig;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<) putchar('-'),x=-x;
int len=,buf[];while(x) buf[len++]=x%,x/=;
for(int i=len-;i>=;i--) putchar(buf[i]+'');return;
}
void init(){
n=read();int x,y;
for(int i=;i<=n;i++){x=read();y=read();L[i]=line(i,x,y);}
return;
}
void work(){
sort(L+,L+n+);n=unique(L+,L+n+)-L-;
for(int i=;i<=n;i++){
while(top>&&getx(S[top-],S[top-])>getx(S[top-],L[i])-esp)top--;
S[top++]=L[i];
}
for(int i=;i<top;i++)ans[i]=S[i].id;
sort(ans+,ans+top);
return;
}
void print(){
for(int i=;i<top;i++)write(ans[i]),PAU;
return;
}
int main(){
init();work();print();return ;
}

最新文章

  1. Python学习之运算符
  2. &quot;巴卡斯杯&quot; 中国大学生程序设计竞赛 - 女生专场
  3. JS的脚本语言
  4. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q32-Q35)
  5. C++模板学习
  6. 第三天:DOM EventListener 句柄的添加和移除
  7. label
  8. C++ GUI Qt4编写的文本编辑器
  9. Genymotion常见问题汇总(转)
  10. 第一个ServiceStack程序
  11. pip install 出现报asciii码错误的解决
  12. Sicily-1009 梅森素数
  13. 如何两周达到150行Java程序的能力--part 1
  14. XML Web Service架构图
  15. AGC006C Rabbit Exercise
  16. Hibernate(三)结构-配置文件-实体映射及配置文件
  17. 【Linux】文件描述符与重定向
  18. 用 go 写 WebAssembly入门
  19. 通用的sql语句
  20. LOJ2421 NOIP2015 信息传递 【tarjan求最小环】

热门文章

  1. [置顶] iOS 名片识别代码
  2. 使用XStream注解实现Java对象与XML互相转换的代码示例
  3. PHP安全编程:HTTP请求欺骗(转)
  4. Java对存储过程的调用方法 --转载
  5. navigaitonBar的自定义设置
  6. [转] Java中的访问控制
  7. MVC模式下的数据展示:EasyUI的datagrid
  8. Linux基础系列—Linux内核源码目录结构
  9. android 安全退出应用程序的几种方法
  10. 2015 Multi-University Training Contest 2