POJ - 2318 TOYS(叉积+二分)
生活随笔
收集整理的這篇文章主要介紹了
POJ - 2318 TOYS(叉积+二分)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目鏈接:點(diǎn)擊查看
題目大意:給出一個(gè)盒子,由n條互不相交的線段分割為n+1個(gè)空格,現(xiàn)在有m個(gè)玩具的坐標(biāo),現(xiàn)在問(wèn)每個(gè)空格內(nèi)有多少個(gè)玩具
題目分析:利用叉積的性質(zhì)判斷點(diǎn)在直線的哪一側(cè):
?以點(diǎn)在直線左側(cè)為例,對(duì)于一個(gè)點(diǎn)來(lái)說(shuō),n條線段就具有了單調(diào)性,以此二分找到該點(diǎn)右邊的直線,則就確定了當(dāng)前點(diǎn)所在的空格了
代碼:
#include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cstring> #include<algorithm> #include<stack> #include<queue> #include<map> #include<set> #include<sstream> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=5e3+100;int ans[N];struct Point{double x,y;Point(){}Point(double _x,double _y){x = _x;y = _y;}void input(){scanf("%lf%lf",&x,&y);}Point operator -(const Point &b)const{return Point(x-b.x,y-b.y);}//叉積double operator ^(const Point &b)const{return x*b.y - y*b.x;}//點(diǎn)積double operator *(const Point &b)const{return x*b.x + y*b.y;} }point[N];struct Line{Point s,e;Line(){}Line(Point _s,Point _e){s = _s;e = _e;} }line[N];int xmult(Point p0,Point p1,Point p2)// ans>0左邊 ans<0右邊 {return (p1-p0)^(p2-p0); }int main() { // freopen("input.txt","r",stdin); // ios::sync_with_stdio(false);int n,m,x1,y1,x2,y2;while(scanf("%d",&n)!=EOF&&n){scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);for(int i=0;i<n;i++){int u,l;scanf("%d%d",&u,&l);line[i]=Line(Point(u,y1),Point(l,y2));}line[n]=Line(Point(x2,y1),Point(x2,y2));memset(ans,0,sizeof(ans));while(m--){Point p;p.input();int l=0,r=n,mark;while(l<=r){int mid=l+r>>1;if(xmult(p,line[mid].s,line[mid].e)<0){mark=mid;r=mid-1;}elsel=mid+1;}ans[mark]++;}for(int i=0;i<=n;i++)printf("%d: %d\n",i,ans[i]);printf("\n");}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的POJ - 2318 TOYS(叉积+二分)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: (转)计算几何模板 - kuangbin
- 下一篇: POJ - 3304 Segments(