题目大意: 给你n种咖啡的烹调方法,每种都包含了该种方法的咖啡的适宜温度,从l 到r,现在需要的咖啡至少满足k种烹调方法, 在q个询问中,每个区间[a,b]中有多少个适宜的咖啡

这道题目,n q给的是200000 显然不可能用n²的方法过,因此这道题应该用前缀和相减来做

思路:我们要知道有多少个适宜的咖啡,我们可以想到对应每种温度之前所有满足的咖啡的个数,那么只要相减,就能得到区间内的符合条件的个数
但是怎么得到每种温度对应的呢? 这就需要再用一次前缀和处理之前烹调方法,对于某一方法 [l ,r] 标记第l位为1,第r+1位为-1, 最后用前缀和处理,就可以了;
ac代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;
const int maxn = 200000+5;
int vis[212345];
int T,n,m;
int v[212345];

int main()
{
    int q,k;
    scanf("%d%d%d",&n,&k,&q);
    memset(vis,0,sizeof(vis));
    memset(v,0,sizeof(v));
    for(int i=1;i<=n;i++)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        vis[l]++;
        vis[r+1]--;

    }
    for(int i=1;i<=maxn;i++)
    {

        vis[i]+=vis[i-1];
       // printf("%d ",vis[i]);
        if(vis[i]>=k)v[i]=1;

    }
   // cout<<endl;
    for(int i=1;i<=maxn;i++)
    {
        v[i]=v[i-1]+v[i];
       // printf("%d ",v[i]);
    }
    for(int i=1;i<=q;i++)
    {

       int s,t;
       scanf("%d%d",&s,&t);
       int ans=v[t]-v[s-1];
       printf("%d\n",ans);
    }

    return 0;
}