1. 程式人生 > >POJ2318:TOYS——題解

POJ2318:TOYS——題解

http log get getch i++ dig span pac mda

http://poj.org/problem?id=2318

題目大意:給一個大矩形,分成n+1份,求落在每一份的點的數量。

——————————————————

首先叉積可以判斷一個點在邊界的左邊還是右邊(不寫公式了)

然後邊界題中給定按順序讀入,顯然是可以二分的,於是二分之。

然後切了。

#include<cstdio>
#include<queue>
#include
<cctype> #include<cstring> #include<vector> #include<algorithm> using namespace std; const int K=5005; typedef double dl; inline int read(){ int X=0,w=0;char ch=0; while(!isdigit(ch)){w|=ch==-;ch=getchar();} while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48
),ch=getchar(); return w?-X:X; } struct point{//既是向量又是點 int x; int y; }q; struct line{ int u; int l; }p[K]; int n,m,x1,y1,x2,y2,ans[K]; inline point getmag(point a,point b){ point s; s.x=b.x-a.x;s.y=b.y-a.y; return s; } inline int multiX(point a,point b){
return a.x*b.y-b.x*a.y; } int erfen(int l,int r){ if(l==r)return l-1; int mid=(l+r)>>1; point a,b; a.x=p[mid].u;a.y=y1; b.x=p[mid].l;b.y=y2; if(multiX(getmag(q,a),getmag(q,b))<0)return erfen(l,mid); return erfen(mid+1,r); } int main(){ bool first=0; while(scanf("%d",&n)!=EOF&&n){ if(first)putchar(\n); first=1; memset(ans,0,sizeof(ans)); int m=read(); x1=read();y1=read(); x2=read();y2=read(); for(int i=1;i<=n;i++){ p[i].u=read(); p[i].l=read(); } for(int i=1;i<=m;i++){ q.x=read(); q.y=read(); ans[erfen(1,n+1)]++; } for(int i=0;i<=n;i++){ printf("%d: %d\n",i,ans[i]); } } return 0; }

POJ2318:TOYS——題解