题目地址:

https://www.acwing.com/problem/content/description/2986/

计算玩具收纳盒中,每个分区内的玩具数量。约翰的父母有一个烦恼----约翰每次玩完玩具以后总会将玩具乱扔。他们为约翰准备了一个长方形的玩具收纳盒,用来放他的玩具。但是约翰非常调皮,每次都非常随意的将玩具扔进盒子中,使得所有玩具都随意混在一起,这让约翰难以找到他喜欢的玩具。对此,约翰的父母想出了一个对策,用若干个纸板将收纳盒分隔成若干个分区,这样至少扔到不同分区的玩具之间还是能分开的。下面是一个收纳盒的俯视图示例。

你的任务是,每当约翰将玩具扔进收纳盒中时,确定每个分区中有多少个玩具。

输入格式:
本题包含多组测试数据。
对于每组数据,第一行包含666个整数n,m,x1,y1,x2,y2n,m,x_1,y_1,x_2,y_2n,m,x1​,y1​,x2​,y2​,表示共有nnn个纸板,mmm个玩具,收纳盒的左上角坐标为(x1,y1)(x_1,y_1)(x1​,y1​),右下角坐标为(x2,y2)(x_2,y_2)(x2​,y2​)。
接下来nnn行,每行包含两个整数Ui,LiU_i,L_iUi​,Li​,表示第iii个纸板的两端点坐标分别为(Ui,y1)(U_i,y_1)(Ui​,y1​)和(Li,y2)(L_i,y_2)(Li​,y2​)。数据保证纸板之间不相交,且按照从左至右顺序依次给出。
接下来mmm行,每行包含两个整数Xj,YjX_j,Y_jXj​,Yj​,表示第jjj个玩具的位置坐标。玩具的给出顺序是随机的。数据保证玩具不会恰好落在纸板上,也不会落在盒子外。
输入由包含单个000的一行结束。

输出格式:
对于每组数据,输出n+1n+1n+1行。
nnn个纸板将收纳盒划分为了n+1n+1n+1个分区,从左到右编号为0∼n0∼n0∼n。
按照分区编号从小到大的顺序,每行输出一行信息i:ji:\ ji: j,其中iii表示分区编号,jjj表示分区内玩具数量。
每组数据之间,用空行隔开。

数据范围:
每个测试点最多包含101010组数据。
1≤n,m≤50001≤n,m≤50001≤n,m≤5000
所有坐标取值范围[−105,105][−10^5,10^5][−105,105]。

对于某个玩具(Xi,Yi)(X_i, Y_i)(Xi​,Yi​),和某个隔板(Ui,y1)−(Li,y2)(U_i,y_1)-(L_i,y_2)(Ui​,y1​)−(Li​,y2​),它在隔板左边当且仅当((Ui,y1)−(Li,y2))×((Xi,Yi)−(Li,y2))=(Ui−Li,y1−y2)×(Xi−Li,Yi−y2)((U_i,y_1)-(L_i,y_2))\times ((X_i, Y_i)-(L_i,y_2))=\\(U_i-L_i,y_1-y_2)\times (X_i-L_i, Y_i-y_2)((Ui​,y1​)−(Li​,y2​))×((Xi​,Yi​)−(Li​,y2​))=(Ui​−Li​,y1​−y2​)×(Xi​−Li​,Yi​−y2​)成右手系。由于隔板是从左到右给出的,所以某个玩具一定对于这些隔板依次是右右……左左……,从而可以二分出位置。代码如下:

#include <iostream>
#include <cstring>
#define x first
#define y second
using namespace std;
using PLL = pair<long, long>;const int N = 5010;
int n, m;
PLL a[N], b[N];
int res[N];PLL operator-(PLL a, PLL b) {return {a.x - b.x, a.y - b.y};
}long cross(PLL a, PLL b) {return a.x * b.y - a.y * b.x;
}int find(long x, long y) {int l = 0, r = n;while (l < r) {int mid = l + r >> 1;if (cross(a[mid] - b[mid], PLL{x, y} - b[mid]) > 0) r = mid;else l = mid + 1;}return l;
}int main() {bool is_first = true;while (scanf("%d", &n), n) {long x1, y1, x2, y2;scanf("%d%ld%ld%ld%ld", &m, &x1, &y1, &x2, &y2);for (int i = 0; i < n; i++) {long u, l;scanf("%ld%ld", &u, &l);a[i] = {u, y1}, b[i] = {l, y2};}a[n] = {x2, y1}, b[n] = {x2, y2};if (is_first) is_first = false;else puts("");memset(res, 0, sizeof res);while (m--) {long x, y;scanf("%ld%ld", &x, &y);res[find(x, y)]++;}for (int i = 0; i <= n; i++)printf("%d: %d\n", i, res[i]);}
}

对于每组数据,时间复杂度O(n+mlog⁡n)O(n+m\log n)O(n+mlogn),空间O(n)O(n)O(n)。

【ACWing】2983. 玩具相关推荐

  1. AcWing 2983. 玩具

    AcWing 2983. 玩具 题目描述 代码 #include<bits/stdc++.h> #define FOR(i,a,b) for(int i=(a);i<=(b);++i ...

  2. AcWing 2983. 玩具 / POJ 2318.toys(计算几何基础、二分、判断点和直线的位置关系)

    计算几何基础题 题目大意就是一个盒子被分成了若干个区域,有m个小球,问每个区域里分别有多少个小球. 我们首先考虑暴力. 我们如何判断小球是否在一个区域内呢,我们发现一个小球在区域x,也就是说所有小于x ...

  3. Acwing:GF和猫咪的玩具(Floyd Python)

    题目链接

  4. 2022-2028年中国木制拼板玩具市场调查研究报告

    [报告类型]产业研究 [报告价格]¥4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国木制拼板玩具行业市场行业相关概述.中国 ...

  5. python 全栈开发,Day132(玩具管理页面,控制玩具通讯录,基于请求的好友关系建立)...

    先下载github代码,下面的操作,都是基于这个版本来的! https://github.com/987334176/Intelligent_toy/archive/v1.5.zip 注意:由于涉及到 ...

  6. [bzoj1054][HAOI2008]移动玩具

    题意:在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动 时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具 ...

  7. python如何编写数据库_如何在几分钟内用Python编写一个简单的玩具数据库

    python如何编写数据库 MySQL, PostgreSQL, Oracle, Redis, and many more, you just name it - databases are a re ...

  8. vPower系列1: vMotion-没有vMotion,虚拟化只是玩具

    vPower今天开讲,第一篇vMotion.vMotion是虚拟化可以支撑核心应用的重要前提,没有vMotion,虚拟化只是玩具,只能应用在实验环境和开发环境.为什么这么说呢?为什么会有vMotion ...

  9. AcWing 734. 能量石 (01背包)+(贪心 - 领项交换)

    AcWing 734. 能量石 #include<cstdio> #include<algorithm> #include<cstring> #include< ...

最新文章

  1. python输入若干个整数试找出其中的最大数和最小数_Python编程的若干个经典小技巧...
  2. 为什么工作10年你的工资还不如新来的实习生
  3. 使用Connector / Python连接MySQL/查询数据
  4. hdu - 2667 Proving Equivalences(强连通)
  5. 端口映射--PortTunnel
  6. 在mysql 使用binlog日志
  7. 新手学堂之有刷/无刷动力电调与马达知识
  8. 软件性能测试操作系统,优秀的系统性能测试软件Sisoft Sandra
  9. 专访全面智能CTO陈章:想法只有在技术落地的那一刻才有撬动地球的能力
  10. weka 贝叶斯 java_weka中朴素贝叶斯的实现
  11. linux u盘 修复工具,如何在Linux终端中修复U盘驱动器问题
  12. ios MultipeerConnectivity蓝牙通讯
  13. 奇偶数求和:输入任意个正整数(以输入负数表示结束输入),分别求出所有的奇数之和,所有的偶数之和。 示例: 输入格式:1 2 3 4 -1 输出格式:sumodd=4 sumeven=
  14. python实现转置矩阵_用Python转置矩阵?
  15. 亚马逊SP-API自发货标记发货对接
  16. Unity内置Shader解读3——Decal
  17. linux下ss工具简介
  18. ​独家 | 一文读懂贝叶斯优化
  19. 那些C++程序让你笑三天的奇葩名字
  20. 公司职位简称表 C?O

热门文章

  1. Ulead GIF Animator制作滚动的文字条幅,循环滚动
  2. iOS 解决CADisplayLink造成循环引用方案
  3. 麒麟 vsftp 搭建
  4. vue当中实现悬浮球可拖拽
  5. day04——判断和循环
  6. openldap自主密码管理系统配置
  7. 经典故事---话说河南人
  8. STM32F429第二十三篇之电容按键
  9. mysql如果计算本月变动/本月增幅/同比变动/同比增幅?
  10. 12_linux笔记-shell脚本命令