当前位置: 首页 > news >正文

蓝桥杯 17110抓娃娃

问题描述

小明拿了 n 条线段练习抓娃娃。他将所有线段铺在数轴上,第 i 条线段的左端点在 li,右端点在 ri​。小明用 m 个区间去框这些线段,第 i个区间的范围是 [Li​, Ri​]。如果一个线段有 至少一半 的长度被包含在某个区间内,则将其视为被这个区间框住。请计算出每个区间框住了多少个线段?

输入格式

输入共 n+m+1 行。

第一行为两个正整数 n, m。

后面 n 行,每行两个整数 li​, ri​。

后面 m 行,每行两个整数Li​, Ri​。

输出格式

输出共 m 行,每行一个整数。

样例输入

3 2
1 2
1 3
3 4
1 4
2 4

样例输出

3
2

评测用例规模与约定

对于 20%20% 的数据,保证 n,m≤10^{3}

对于 100%100% 的数据,保证 n,m≤10^{5},li​<ri​,0<li,ri,Li,Ri≤10^{6},max⁡{ri−li}≤min⁡{Ri−Li}.

运行限制

语言最大运行时间最大运行内存
C++1s256M
C1s256M
Java3s256M
Python33s256M
PyPy33s256M
Go3s256M
JavaScript3s256M

 

首先题目保证了 max{ri​−li​}≤min{Ri​−Li​},那么如果某个区间包含了某个线段,则该区间一定包含了这个线段的中点。

我们就可以在输入 li​,ri​ 的时候,标记其中点 (mp[(l+r)/2]++),再做一遍前缀和,最后查询时 [Li​,Ri​] 这个区间的和就是答案。

注意:

有可能会出现中点的位置是个小数这种情况,所以我们不妨把所有坐标都 ×2 (不要忘记数组大小也要开两倍),以避免上述情况的发生。

 

#include<iostream>
using namespace std;

const int N = 2e6+10;
int n, m;  //n条线段  m个区间
int mp[N];

int main()
{
	cin>>n>>m;
	int l, r;
	for(int i=1; i<=n; ++i)
	{
		cin>>l>>r;
		mp[l+r]++;  //记录每条线段中点的位置 
	}
	
	for(int i=1; i<N; ++i)
	{
		mp[i] += mp[i-1];
	}
	
	for(int i=1; i<=m; ++i)
	{
		cin>>l>>r;
		l *= 2;
		r *= 2;
		
		//一段区间包含了多少个中点就覆盖了多少条线段 
		cout<<mp[r] - mp[l-1]<<endl;  //l-1:线段的中点恰好在 L 上 
	}
	
	return 0;
}

 

相关文章:

  • 登山第十九梯:实时点云压缩——量变质不变
  • FreeRTOS(9)信号量-计数型信号量
  • 半导体工艺(七)干法刻蚀1.0
  • EaseUS Todo Backup Pro v16.0 数据备份还原软件
  • neo4j中常用cql命令汇总(基础版)
  • VS Code远程Docker开发配置指南——完美速通
  • idea 2023社区版自动生成 serialVersionUID
  • 搜广推校招面经四十六
  • FastDDS中Utils定义的那些数据结构(二)
  • redis增加ip白名单
  • 多数元素——面试经典150题(力扣)
  • 30天学习Java第四天——JVM规范
  • Chrome 扩展开发 API实战:Sessions (六)
  • 使用Python实现ICO文件生成工具
  • TensorFLow深度学习实战(11)——风格迁移详解
  • 电脑突然没有声音的可能原因与应对方法
  • NineData:解锁多云与混合云环境下的智能数据管理
  • 艾尔登复刻Ep1——客户端制作、场景切换、网络控制
  • Spring Boot 读取 ZooKeeper (ZK) 属性的总结指南
  • Lsposed模块原理详解
  • 金价剧烈波动下黄金该加仓还是观望?世界黄金协会回应
  • 上海黄浦推动建设金融科技集聚区,对创新主体最高扶持1亿元
  • 中方在世贸组织对美国“对等关税”表达关注,呼吁维护多边主义
  • 北证50年内涨超42%,创历史新高!后市机构怎么看?
  • 焦点访谈丨售假手段又翻新,警惕化肥“忽悠团”的坑农套路
  • 中国社科院国际合作局副局长廖凡调任世界经济与政治研究所所长