AcWing5267--------合格数

给定 n个整数区间,其中第 i个区间为 [li,ri]。

如果一个整数被至少 k 个给定区间所包含,就称这个整数为合格数。

你需要回答 q 个问题。

第 i个问题给定两个整数 a,b,请你计算 [a,b]范围内有多少个合格数。

输入格式

第一行包含三个整数 n,k,q。

接下来 n行,每行包含两个整数 li,ri,表示一个给定区间。

接下来 q 行,每行包含两个整数 a,b,用来描述一个问题。

输出格式

每个问题输出一行结果,一个整数,表示 [a,b] 范围内合格数的数量。

数据范围

前 4个测试点满足 1≤k≤n≤5,1≤q≤5。
所有测试点满足 1≤k≤n≤2×105,1≤q≤2×105,1≤li≤ri≤2×105,1≤a≤b≤2×105。

输入样例1:
3 2 4
1 4
2 7
7 9
2 4
3 7
5 6
1 10
输出样例1:
3
3
0
4
输入样例2:
2 1 1
1 1
100 100
9 10
输出样例2:
0

解析:

此题可以用差分和前缀和来做,我们先把给出区间中的数都做好加1的标记,这里就可以用差分O(1)的时间复杂度完成,然后在求出这个差分数组的前缀和,就是原数组,找出区间中数的出现次数,把满足k的区间中的数组标记为1(也是相当于加1),求出前缀和,就是想要的区间合格数。


AC代码如下:

#include 
#include 
#include 

using namespace std;

const int N = 2e5+10;
int a[N],s[N];

void insert(int l,int r)
{
    a[l] += 1;
    a[r+1] -= 1;
}

int main()
{
    int n,k,q;
    scanf("%d %d %d", &n, &k, &q);
    while(n--)
    {
        int l,r;
        scanf("%d %d",&l,&r);
        insert(l,r);//标记一下区间数出现的次数
    }
    //差分数组a的前缀和,求一下区间中数出现的数字的总次数
    for(int i=1;i= k) s[i]++;
    }
    //求一下前缀和,方便后面计算区间中有多少满足情况的数字
    for (int i = 1; i < N; i ++ )
    {
        s[i] = s[i-1] + s[i];
    }
    while(q--)
    {
        int l,r;
        scanf("%d %d", &l, &r);
        //求出问题区间中有多少个满足的情况
        cout << s[r] - s[l-1] << endl;
    }
    return 0;
}

你可能感兴趣的:(题解,算法,数据结构,c++,蓝桥杯)