bzoj1007

维护一个凸壳。。。。。运算符重载搞错了。。。。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<ctime>
 5 #include<cstdlib>
 6 #include<iostream>
 7 #include<algorithm>
 8 #define rep(i,l,r) for(int i=l;i<(r);i++)
 9 #define clr(a,x) memset(a,x,sizeof(a))
10 using namespace std;
11 typedef long long ll;
12 const int maxn=50009;
13 struct line{
14     int p;
15     double a,b;
16     inline bool operator<(const line&A)const{
17         return a<A.a||(a==A.a&&b>A.b);
18     }
19 };
20 int n,top=0,S[maxn];
21 line x[maxn];
22 bool p[maxn];
23 double cross(int a,int b){
24     return (x[b].b-x[a].b)/(x[a].a-x[b].a);
25 }
26 int main(){
27     scanf("%d",&n);
28     rep(i,1,n+1) scanf("%lf%lf",&x[i].a,&x[i].b),x[i].p=i;
29     sort(x+1,x+n+1);
30     rep(i,1,n+1){
31         if(i>1&&x[i].a==x[i-1].a) continue;
32         while(top>1&&cross(S[top-1],S[top])>=cross(S[top],i)) S[top--]=0;
33         S[++top]=i;
34     }
35     rep(i,1,top+1) p[x[S[i]].p]=1;
36     rep(i,1,n+1) if(p[i]) printf("%d ",i);putchar('\n');
37     return 0;
38 }
View Code

1007: [HNOI2008]水平可见直线

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 4623  Solved: 1708
[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

 
[Submit][Status][Discuss]
posted @ 2015-09-17 14:30  ChenThree  阅读(152)  评论(0编辑  收藏  举报