题目链接:https://vjudge.net/problem/POJ-2318

题意:有n条线将矩形分成n+1块,m个点落在矩形内,求每一块点的个数。

思路:

  最近开始肝计算几何,之前的几何题基本处于挂机状态,但听别人说几何题不会太难,所以打算把几何给过了。

  先引入叉积的一个重要性质,O为原点:

    OP^OQ>0 : P在Q的顺时针方向。

    OP^OQ<0 : P在Q的逆时针方向。

    OP^OQ=0 : O,P,Q共线。

  那么我们就可以利用该性质判断一个点P在直线AB的左侧当且仅当:PA^PB<0。

  再发现可以用二分查找第一条满足点在直线左侧的直线即可,其单调性显然可知。

AC code:

#include<cstdio>
#include<algorithm>
using namespace std; const int maxn=;
int n,m,x1,y1,x2,y2,ans[maxn],flag=; struct Point{
int x,y;
Point(){}
Point(int xx,int yy):x(xx),y(yy){}
Point operator + (const Point& b)const{
return Point(x+b.x,y+b.y);
}
Point operator - (const Point& b)const{
return Point(x-b.x,y-b.y);
}
int operator * (const Point& b)const{
return x*b.x+y*b.y;
}
int operator ^ (const Point& b)const{
return x*b.y-b.x*y;
}
}; struct Line{
Point s,e;
Line(){};
Line(Point ss,Point ee){
s=ss,e=ee;
}
}line[maxn]; int check(int x,int y,int m){
Point pt=Point(x,y);
return (line[m].s-pt)^(line[m].e-pt);
} int main(){
while(scanf("%d",&n),n){
if(flag) flag=;
else printf("\n");
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
for(int i=;i<=n;++i)
ans[i]=;
for(int i=;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));
while(m--){
int x,y;
scanf("%d%d",&x,&y);
Point pt=Point(x,y);
int l=,r=n,mid;
while(l<=r){
mid=(l+r)>>;
if(check(x,y,mid)<=) r=mid-;
else l=mid+;
}
++ans[l];
}
for(int i=;i<=n;++i)
printf("%d: %d\n",i,ans[i]);
}
}

最新文章

  1. PhoneGap奇怪的现象:File FileTransfer download, 手机相册检测不到下载下来的图片(解决)
  2. kylin的安装与配置
  3. 根据执行计划优化sql语句
  4. windows 计算机 管理 命令
  5. Chapter6:函数
  6. Redis集群明细文档
  7. Spark SQL利器:cacheTable/uncacheTable
  8. 获取nginx ip地理信息
  9. 蓝牙门禁Android客户端
  10. PHP 类的封装和使用
  11. Java加密与解密笔记(二) 对称加密
  12. ExtJS中xtype 概览
  13. windows一机多装mysql,5.5+版本,8.0.11版本
  14. Hibernate的load和get方法的区别
  15. 高通 NXP NFC(PN547PN548) 移植流程 android6.0
  16. ubuntu ------ 网络 ifconfig 不显示IP地址
  17. (欧拉公式 很水) Coprimes -- sgu -- 1002
  18. ACM数论之旅9---中国剩余定理(CRT)(壮哉我大中华╰(*&#176;▽&#176;*)╯)
  19. coursera课程Text Retrieval and Search Engines之Week 2 Overview
  20. [Javascript] Hositing

热门文章

  1. CF46F Hercule Poirot Problem
  2. 生日礼物 HYSBZ - 1293 【单调队列】【求最短区间的长度,区间需要满足包含所有颜色种类】
  3. P3306 [SDOI2013]随机数生成器
  4. MySQL Data Directory -- Creating file-per-table tablespaces outside the data directory
  5. 1~100卡特兰数(存一下hhhh)
  6. MySQL数据分析(7)-SQL的两大学习框架
  7. 自制操作系统-使用汇编显示 hello world
  8. zookeeper源码 — 三、集群启动—leader、follower同步
  9. SQL-W3School-高级:SQL UNIQUE 约束
  10. 003-多线程-JUC线程池-几种特殊的ThreadPoolExecutor【newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor、newScheduledThreadPool】