POJ2318:TOYS——题解

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=;
typedef double dl;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),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-;
int mid=(l+r)>>;
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))<)return erfen(l,mid);
return erfen(mid+,r);
}
int main(){
bool first=;
while(scanf("%d",&n)!=EOF&&n){
if(first)putchar('\n');
first=;
memset(ans,,sizeof(ans));
int m=read();
x1=read();y1=read();
x2=read();y2=read();
for(int i=;i<=n;i++){
p[i].u=read();
p[i].l=read();
}
for(int i=;i<=m;i++){
q.x=read();
q.y=read();
ans[erfen(,n+)]++;
}
for(int i=;i<=n;i++){
printf("%d: %d\n",i,ans[i]);
}
}
return ;
}
上一篇:基于Linux的视频传输系统(上大学时參加的一个大赛的论文)


下一篇:MySQL错误代码大全(史上最全)