2015年ALPC暑期专题练习I (计算几何) A

久违的1A,爽!

题目大意:根据玩具的坐标,得到每个硬纸板中有几个玩具。

思路:先对线进行排序,得到每个分片的id,然后逐个判断玩具在哪条线的左边,即可得到id。主要是点和线类的构造函数与拷贝函数。

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<string>
#include<map>
#include<set>
#include<algorithm>
#include<vector>
//#include<cmath>
using namespace std;
int min_2 (int& a,int& b){return a<b?a:b;}
int max_2 (int& a,int& b){return a>b?a:b;}

const int MAX_NUM = 5000+10;
struct point{
  int x,y;
  point (int i,int j){
	x=i;y=j;
  }
  point (const point& p){
	x=p.x;y=p.y;
  }
  point& operator = (const point& p){
	x=p.x;y=p.y;
	return *this;
  }
  point (){}
};
struct line : point{
  point x,y;
  line (point i,point j){
	x=i;y=j;
  }
  line (){}
};
line lineSet[MAX_NUM];
struct polygon : point{
  point ul,ll,lr,ur;
}polygonSet[MAX_NUM];

int n,m,x1,y1,x2,y2;
int toyNum[MAX_NUM];

bool cmp (line l,line r)
{
  int ll=min_2 (l.x.x,l.y.x);
  int lr=min_2 (r.x.x,r.y.x);
  return ll<lr;
}
int CrossMuti (point a,point b)
{
  return a.x*b.y-a.y*b.x;
}
int JudgePointDirWithLine (point& x,int id) {
  point ac (x.x-lineSet[id].x.x , x.y-lineSet[id].x.y);
  point ab (lineSet[id].y.x-lineSet[id].x.x , lineSet[id].y.y-lineSet[id].x.y);
  if (CrossMuti (ac,ab)<0)//x int id right
	return 1;
  else if (CrossMuti (ac,ab)>0)//x int id lift
	return 2;
  else return 0;//error
}

int main()
{
  while (scanf ("%d",&n) && n)
  {
	scanf ("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
	memset (toyNum,0,sizeof (toyNum));
	int ui,li;
	for (int i=1;i<=n;i++){
	  scanf ("%d %d",&ui,&li);
	  lineSet[i].x=point (ui,y1);
	  lineSet[i].y=point (li,y2);
	}
	lineSet[0].x=point (x1,y1);
	lineSet[0].y=point (x1,y2);
	lineSet[n+1].x=point (x2,y1);
	lineSet[n+1].y=point (x2,y2);
	sort (lineSet,lineSet+n+2,cmp);
	/*for (int i=0;i<n+2;i++)
	  printf ("%d ",lineSet[i].y.x);
	printf ("\n");*/
	
	point toy;
	for (int i=0;i<m;i++){
	  scanf ("%d %d",&toy.x,&toy.y);
	  for (int j=0;j<n+2;j++){
		if (JudgePointDirWithLine (toy,j)==2){
		  ++toyNum[j-1];
		  break;
		}
	  }
	}
	for (int i=0;i<=n;i++)
	  printf ("%d: %d\n",i,toyNum[i]);
	printf ("\n");
	
  }
  return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值