pku2318 自己想的 超时
来源:互联网 发布:费洛伊德算法 编辑:程序博客网 时间:2024/05/01 07:21
#include<iostream>#include<algorithm>#define MAX 5010using namespace std;typedef struct point{ double x,y;};typedef struct line{ point start,end;};int max(int x,int y) { return x>y? x:y; } int min(int x,int y) { return x<y? x:y; } double multi(point p0,point p1,point p2){ return (p1.x-p0.x)*(p2.y-p0.y) -(p2.x-p0.x)*(p1.y-p0.y); } bool is_cross(point s1,point e1,point s2,point e2){ return max(s1.x,e1.x)>=min(s2.x,e2.x)&& max(s2.x,e2.x)>=min(s1.x,e1.x)&& max(s1.y,e1.y)>=min(s2.y,e2.y)&& max(s2.y,e2.y)>=min(s1.y,e1.y)&& multi(s2,e1,s1)*multi(e1,e2,s1)>=0&& multi(s1,e2,s2)*multi(e2,e1,s2)>=0; }line b[MAX];point t;int ans[MAX];int main(){ int board,toy,i,j,k; point Y,X,S; while(cin>>board) { if(board==0) break; cin>>toy>>Y.x>>Y.y>>X.x>>X.y; S.x=Y.x; S.y=X.y; memset(ans,0,sizeof(ans)); for(i=1;i<=board;i++) { cin>>b[i].start.x>>b[i].end.x; b[i].start.y=Y.y; b[i].end.y =X.y; } for(i=1;i<=toy;i++) { cin>>t.x>>t.y;k=0; for(j=1;j<=board;j++) { if(is_cross(S,t,b[j].start,b[j].end)) k=j; } ans[k]=ans[k]+1; } for(i=0;i<=board;i++) cout<<i<<": "<<ans[i]<<endl; } return 0;}