T235568 弹幕考察

题目描述

zeromaker 对弹幕的视野控制有着深刻的研究。 每个弹幕在一段特定的时间内会出现在 zeromaker 的视野内,除此之外的时间都在 zeromaker 看不到的地方。在 zeromaker 看来,视野内的弹幕数量越多,图就越难,因为这意味着 @#¥%。 现在,zeromaker 想要评测这张图的难度,他已经知道了每个弹幕会在什么时候出现在视野内,他想知道,在一段时间内,总共有多少个弹幕出现在他的视野内过。

输入格式

第一行有两个整数 nnn , mmm ,表示一共有 nnn 个弹幕,而 zeromaker 有 mmm 个问题。

接下来 nnn 行,每行两个数 aaa,bbb,表示这个弹幕 aaa 秒时出现在 zeromaker 的视野内,出现了 bbb 秒。 接下来 mmm 行,每行两个整数 xxx , yyy ,表示从 xxx 秒开始,经过 yyy 秒,其中有多少个弹幕出现过。

注意:查询区间为左闭右闭,弹幕出现区间为左开右开

输出格式

mmm 行,即对于 zeromaker 提出的每个问题的答案。

输入输出样例

输入 #1
3 2
2 5
0 10
5 8
0 6
8 2
输出 #1
3
2
输入 #2
1 2
0 10
9 1
10 1
输出 #2
1 
0

思路:

把n个区间存到l和r这两个数组,从小到大进行排序;

对于每个x,y,通过二分查找l数组里第一个小于y的数的下标,同理在r数组里查找第一个小于y的数的下标,后者减去前者就是结果

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
const int N=10000000;
ll l[N],r[N];
int n,m;ll x,y;
int main(){

    cin>>n>>m;
    for(int i=1;i<=n;i++){
        scanf("%lld%lld",&l[i],&r[i]);
        r[i]+=l[i]-1;
    }
    sort(l+1,l+1+n);
    sort(r+1,r+1+n);
    for(int i=1;i<=m;i++){
        scanf("%lld%lld",&x,&y); y+=x;
        int l0=lower_bound(l+1,l+1+n,y)-l;
        int r0=lower_bound(r+1,r+1+n,x)-r;
        printf("%d\n",l0-r0);

    }
}

 

posted @ 2022-04-26 21:56  嗨嗨害  阅读(58)  评论(0)    收藏  举报