题意
给你n个区间,k,q次询问
(1 ≤ k ≤ n ≤ 200000,1 ≤ q ≤ 200000)
每次询问给定一个区间,求区间中每个数合法数量,如果每个数满足n个区间的数量>=k,则为合法数;
simple input
3 2 4
91 94
92 97
97 99
92 94
93 97
95 96
90 100
simple output
3
3
0
4
思路
利用差分求出合法区间,利用二分找出每次询问区间中在合法区间的边界
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int mod=1000000007,N=2e5+10;
int arr[N];
int main(){
int n,k,q,l,r;
cin>>n>>k>>q;
for(int i=1;i<=n;i++)
{
cin>>l>>r;
arr[l]++;
arr[r+1]--;//先差分
}
for(int i=1;i<=200000;i++)
{
arr[i]+=arr[i-1]; //求前缀和
}
vector<int> ve;
for(int i=1;i<=200000;i++)
{
if(arr[i]>=k) ve.push_back(i);//得到>=k的合法区间
}
while(q--)
{
cin>>l>>r;//二分
int l1=lower_bound(ve.begin(),ve.end(),l)-ve.begin();//二分得到大于等于l的合法区间的边界
int r1=upper_bound(ve.begin(),ve.end(),r)-ve.begin();//二分得到大于r的合法区间的边界
cout<<r1-l1<<endl;
}
return 0;
}