【POJ - 2318】TOYS(计算几何,叉积判断点与直线位置关系,二分)

题干:

Calculate the number of toys that land in each bin of a partitioned toy box. 
Mom and dad have a problem - their child John never puts his toys away when he is finished playing with them. They gave John a rectangular box to put his toys in, but John is rebellious and obeys his parents by simply throwing his toys into the box. All the toys get mixed up, and it is impossible for John to find his favorite toys. 

John's parents came up with the following idea. They put cardboard partitions into the box. Even if John keeps throwing his toys into the box, at least toys that get thrown into different bins stay separated. The following diagram shows a top view of an example toy box. 
 
For this problem, you are asked to determine how many toys fall into each partition as John throws them into the toy box.

Input

The input file contains one or more problems. The first line of a problem consists of six integers, n m x1 y1 x2 y2. The number of cardboard partitions is n (0 < n <= 5000) and the number of toys is m (0 < m <= 5000). The coordinates of the upper-left corner and the lower-right corner of the box are (x1,y1) and (x2,y2), respectively. The following n lines contain two integers per line, Ui Li, indicating that the ends of the i-th cardboard partition is at the coordinates (Ui,y1) and (Li,y2). You may assume that the cardboard partitions do not intersect each other and that they are specified in sorted order from left to right. The next m lines contain two integers per line, Xj Yj specifying where the j-th toy has landed in the box. The order of the toy locations is random. You may assume that no toy will land exactly on a cardboard partition or outside the boundary of the box. The input is terminated by a line consisting of a single 0.

Output

The output for each problem will be one line for each separate bin in the toy box. For each bin, print its bin number, followed by a colon and one space, followed by the number of toys thrown into that bin. Bins are numbered from 0 (the leftmost bin) to n (the rightmost bin). Separate the output of different problems by a single blank line.

Sample Input

5 6 0 10 60 0
3 1
4 3
6 8
10 10
15 30
1 5
2 1
2 8
5 5
40 10
7 9
4 10 0 10 100 0
20 20
40 40
60 60
80 805 10
15 10
25 10
35 10
45 10
55 10
65 10
75 10
85 10
95 10
0

Sample Output

0: 2
1: 1
2: 1
3: 1
4: 0
5: 10: 2
1: 2
2: 2
3: 2
4: 2

Hint

As the example illustrates, toys that fall on the boundary of the box are "in" the box.

题目大意:

    在一个盒子内用挡板隔开给出挡板两端坐标和一些玩具的坐标输出落在每个方格中的玩具数量。

解题报告:

      通过叉积直接判断玩具点和直线的位置关系,从而确定玩具归属于哪一个格子,二分找位置,找到之后还要来一个if判断来确认这个位置是否正确(即做±1的微调)。再就是注意格式,输出之间需要一个空行。

AC代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>using namespace std;
int n,m,x1,x2,y1,y2;
int ans[5005];
int top;
struct Point {int x,y;Point(){}Point(int x,int y):x(x),y(y){} 
} p[5005];
struct Edge {Point s,e;Edge(){}Edge(Point s,Point e):s(s),e(e){} 
} e[5005];int xmult(Point o,Point a,Point b) {return (a.x-o.x) * (b.y-o.y) - (a.y-o.y) * (b.x-o.x);
}
int main()
{int xx1,xx2,xx,yy;while(~scanf("%d%d%d%d%d%d",&n,&m,&x1,&y1,&x2,&y2)) {if(n == 0) break;memset(ans,0,sizeof(ans));top = 0;for(int i = 1; i<=n; i++) {scanf("%d%d",&xx1,&xx2);e[i] = Edge(Point(xx1,y1),Point(xx2,y2));}e[n+1] = Edge(Point(x2,y1),Point(x2,y2)); for(int i = 1; i<=m; i++) {scanf("%d%d",&xx,&yy);p[i] = Point(xx,yy);}int l,r,mid;for(int i = 1; i<=m; i++) {l = 1; r = n+1;//如果这里是r=n+1,那就必须加 35行的e[n+1] = Edge(Point(x2,y1),Point(x2,y2)); 这一句。但是这里也可以直接r=n,这样就不需要35行那句了并且也可以ac。想想为什么 mid = (l+r)/2;while(l<r) {mid = (l+r)/2;if(xmult(p[i],e[mid].s,e[mid].e) < 0) r = mid;else l = mid+1;}if(xmult(p[i],e[l].s,e[l].e) < 0) ans[l]++;else ans[l+1]++;}for(int i = 1; i<=n+1; i++) {printf("%d: %d\n",i-1,ans[i]);}puts(""); }return 0 ;
}

今天又写了一遍:(也算是体会到判断ans[l]++或者ans[l+1]++的真正原因)

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
int n,m,x1,x2,y1,y2;//n个板子,m个玩具,左上角,右下角。 struct Edge {int x1,y1;//上 int x2,y2;//下 
} e[5005];
struct Node {int x,y;
} node[5005];
int ans[5005];
int cal(int tar,int line) {return (node[tar].x - e[line].x2)*(e[line].y1-e[line].y2) - (e[line].x1 - e[line].x2)*(node[tar].y - e[line].y2);
} 
int main()
{while(cin>>n) {if(n == 0) break;cin>>m>>x1>>y1>>x2>>y2;memset(ans,0,sizeof ans);for(int i = 1; i<=n; i++) {scanf("%d%d",&e[i].x1,&e[i].x2);e[i].y1 = y1;e[i].y2 = y2;}for(int i = 1; i<=m; i++) {scanf("%d%d",&node[i].x,&node[i].y);}//process each for(int i = 1; i<=m; i++) {int l = 1,r = n;int mid = (l+r)/2;while(l<r) {mid = (l+r)/2;if(cal(i,mid) > 0) l=mid+1;else r=mid; }if(l == n) {if(cal(i,l) < 0) ans[l]++;else ans[l+1]++;				}else ans[l]++;}for(int i = 1; i<=n+1; i++) {printf("%d: %d\n",i-1,ans[i]);}printf("\n");}return 0 ;}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/441740.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

esp32 micropython spiffs_spiffs 文件系统在esp32中的应用

spiffs 介绍SPIFFS 是一个开源文件系统&#xff0c;用于 SPI NOR flash 设备的嵌入式文件系统&#xff0c;支持磨损均衡、文件系统一致性检查等功能。spiffs 源码地址​github.comspiffs 特点而我们知道乐鑫的esp32的大部分存储都依赖于SPI flash &#xff0c;spiffs可以说对于…

【HDU - 1968】【UVA - 12096】The SetStack Computer (模拟,集合求交集并集操作,STL实现)

题干&#xff1a; Background from Wikipedia: 揝et theory is a branch of mathematics created principally by the German mathematician Georg Cantor at the end of the 19th century. Initially controversial, set theory has come to play the role of a foundational…

info testing mysql_SQLMASQLMAP中文说明(linux版本)

这个东西&#xff0c;是mickey整理的&#xff0c;不多说了&#xff0c;尊重一下原作者&#xff0c;转载注明mickey整理就好了更新svn checkout https://svn.sqlmap.org/sqlmap/trunk/sqlmap sqlmap-devsqlmap.py -u "http://www.islamichina.com/hotelinchina.asp?cityid…

关于C++里面使用set_union,set_intersections、set_merge、set_difference、set_symmetric_difference等函数的使用总结

set里面有set_intersection&#xff08;取集合交集&#xff09;、set_union&#xff08;取集合并集&#xff09;、set_difference&#xff08;取集合差集&#xff09;、set_symmetric_difference&#xff08;取集合对称差集&#xff09;等函数。其中&#xff0c;关于函数的五个…

java mouseenter_关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别

最近在做的在线考试和课程商城都遇到这样的问题&#xff1a;就是鼠标滑过的时候出现一个层&#xff0c;当鼠标滑到当前层的话mouseover和mouseout在低版本的浏览器会出现闪动的现象&#xff0c;解决这个现象的办法有许多&#xff0c;不过我觉得有一种是最简单的那就是把mouseov…

【HDU - 1465 】不容易系列之一 (组合数学,错排)

题干&#xff1a; 大家常常感慨&#xff0c;要做好一件事情真的不容易&#xff0c;确实&#xff0c;失败比成功容易多了&#xff01; 做好“一件”事情尚且不易&#xff0c;若想永远成功而总从不失败&#xff0c;那更是难上加难了&#xff0c;就像花钱总是比挣钱容易的道理一…

java gc回收机制种类_JAVA的垃圾回收机制(GC)

1.什么是垃圾回收&#xff1f;垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制。2.什么时候垃圾回收&#xff1f;System.gc()Runtime.getRuntime().gc()上面的方法调用时用于显式通知…

【HDU - 4217 】Data Structure? (线段树求第k小数)

题干&#xff1a; Data structure is one of the basic skills for Computer Science students, which is a particular way of storing and organizing data in a computer so that it can be used efficiently. Today let me introduce a data-structure-like problem for y…

java redis 重连_突破Java面试(23-4) - Redis 复制原理

全是干货的技术号&#xff1a;本文已收录在github&#xff0c;欢迎 star/fork&#xff1a;在Redis复制的基础上(不包括Redis Cluster或Redis Sentinel作为附加层提供的高可用功能)&#xff0c;使用和配置主从复制非常简单&#xff0c;能使得从 Redis 服务器(下文称 slave)能精确…

【HDU - 4006】The kth great number (优先队列,求第k大的数)

题干&#xff1a; Xiao Ming and Xiao Bao are playing a simple Numbers game. In a round Xiao Ming can choose to write down a number, or ask Xiao Bao what the kth great number is. Because the number written by Xiao Ming is too much, Xiao Bao is feeling giddy…

java获取u盘_实例分享java监听u盘的方法

package org.load.u;import java.io.File;import java.util.LinkedHashMap;import java.util.Map;// U盘检测public class CheckU {// 存放磁盘状态private static Map map new LinkedHashMap();// 定义磁盘private static final String[] arr new String[] {"C", …

【POJ - 1562】Oil Deposits (dfs搜索,连通块问题)

题干&#xff1a; The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land into numerous square plots. It …

python列表浅复制_Python列表深浅复制详解

转自&#xff1a;https://www.cnblogs.com/blaomao/p/7239203.html在文章《Python 数据类型》里边介绍了列表的用法&#xff0c;其中列表有个 copy() 方法&#xff0c;意思是复制一个相同的列表。例如1 names ["小明", "小红", "小黑", "小…

【HYSBZ - 1192】鬼谷子的钱袋(水题,二进制)

题干&#xff1a; 鬼谷子非常聪明&#xff0c;正因为这样&#xff0c;他非常繁忙&#xff0c;经常有各诸侯车的特派员前来向他咨询时政。有一天&#xff0c;他在咸阳游历的时候&#xff0c;朋友告诉他在咸阳最大的拍卖行&#xff08;聚宝商行&#xff09;将要举行一场拍卖会&a…

【CodeForces - 735B】Urbanization (找规律,思维)

题干&#xff1a; Local authorities have heard a lot about combinatorial abilities of Ostap Bender so they decided to ask his help in the question of urbanization. There are n people who plan to move to the cities. The wealth of the i of them is equal to a…

java 文本查找_Java基于正则表达式实现查找匹配的文本功能【经典实例】

本文实例讲述了Java基于正则表达式实现查找匹配的文本功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;REMatch.java&#xff1a;package reMatch;import java.util.regex.Matcher;import java.util.regex.Pattern;/*** Created by Frank*/public class REMatch {p…

【51nod - 1073】约瑟夫环问题模板

题干&#xff1a; N个人坐成一个圆环&#xff08;编号为1 - N&#xff09;&#xff0c;从第1个人开始报数&#xff0c;数到K的人出列&#xff0c;后面的人重新从1开始报数。问最后剩下的人的编号。 例如&#xff1a;N 3&#xff0c;K 2。2号先出列&#xff0c;然后是1号&am…

java oracle database user dsn_跨会话序列化数据库连接

我正在开发一个web应用程序&#xff0c;它需要使用最终用户提供的凭据登录到数据库&#xff1b;应用程序本身没有登录到数据库。在问题是如何为每个用户会话创建一个连接。在一种方法是&#xff1a;请求用户凭据检查针对数据库后端的凭据是否有效在会话级变量中存储凭据这种方法…

【POJ - 3125 】Printer Queue(模拟,队列+优先队列,STL)

题干&#xff1a; The only printer in the computer science students union is experiencing an extremely heavy workload. Sometimes there are a hundred jobs in the printer queue and you may have to wait for hours to get a single page of output. Because some …

java循环单链表类构造函数_C++实现双向循环链表

本文实例为大家分享了C实现双向循环链表的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下一、概念1.在双链表中的每个结点应有两个链接指针&#xff1a;lLink -> 指向前驱结点 (前驱指针或者左链指针)rLink->指向后继结点(后驱指针或者右链指针)2.双链表常采用…