弹幕考察
P2650 弹幕考察
题目链接:https://www.luogu.com.cn/problem/P2650
题目描述:
题目背景
zeromaker 是个手残,但是他喜欢玩东方 project,ex 什么的最喜欢了
题目描述
zeromaker 对弹幕的视野控制有着深刻的研究。 每个弹幕在一段特定的时间内会出现在 zeromaker 的视野内,除此之外的时间都在 zeromaker 看不到的地方。在 zeromaker 看来,视野内的弹幕数量越多,图就越难,因为这意味着 @#¥%。 现在,zeromaker 想要评测这张图的难度,他已经知道了每个弹幕会在什么时候出现在视野内,他想知道,在一段时间内,总共有多少个弹幕出现在他的视野内过。
输入格式
第一行有两个整数 nn , mm ,表示一共有 nn 个弹幕,而 zeromaker 有 mm 个问题。
接下来 nn 行,每行两个数 aa,bb,表示这个弹幕 aa 秒时出现在 zeromaker 的视野内,出现了 bb秒。 接下来 mm 行,每行两个整数 xx , yy ,表示从 xx 秒开始,经过 yy 秒,其中有多少个弹幕出现过。
注意:查询区间为左闭右闭,弹幕出现区间为左开右开。
输出格式
mm 行,即对于 zeromaker 提出的每个问题的答案。
输入输出样例
3 2 2 5 0 10 5 8 0 6 8 2
3 2
1 2 0 10 9 1 10 1
1 0
说明/提示
- 30\%30% 的数据:n,m \le 10^3n,m≤103。
- 100\%100% 的数据:1 \le n,m \le 10^51≤n,m≤105,0 \le x,y,a,b \le 2^{31}-10≤x,y,a,b≤231−1
解题思路:
1.对弹幕进行分类,找出一个有效的式子是能被算出哪些弹幕被“看见”了。
2.注意到所有左区间在考察区间右端左边的弹幕,只要去掉右区间在考察区间左边的,剩下的将必然”看得见“。
(所有右区间在考察区间左端右边的减掉左区间在考察区间右边的弹幕一样可行
3.可使用lower-bound函数快速求出固定区间以及条件下的弹幕数量。
参考代码:
#include <iostream>
#include <algorithm>
using namespace std;
#define Max 100000
int main()
{
int zuo[Max];int you[Max];int n,m,a1,a2,ans;
cin>>n>>m;
for(int i=0;i<n;i++)
{cin>>zuo[i]>>you[i];you[i]+=zuo[i]-1;}
sort(zuo,zuo+n);
sort(you,you+n);
for(int i=0;i<m;i++)
{
cin>>a1>>a2;a2+=a1;
ans=lower_bound(zuo,zuo+n,a2)-zuo;
ans-=lower_bound(you,you+n,a1)-you;
cout << ans<< endl;
}
return 0;
}
浙公网安备 33010602011771号