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 }
1007: [HNOI2008]水平可见直线
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 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
-1 0
1 0
0 0
Sample Output
1 2