已知n,k,q,n组温度l,r,求至少出现k次的温度,q次问询,求问询区间里有多少个满足条件的温度。
前缀和。
用l,r数组标记,每次起点+1,终点 + 1的位置-1,最后求前缀和,则为该温度出现的次数。
将出现大于k次的置为1,否则为0,求前缀和,则为满足条件次数的前缀和,sum[r] - sum[l]可快速求解。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespacestd;
const int maxn =2 * 1e5 +5;
int l[maxn],r[maxn],sum[maxn];
int main()
{
memset(l,0,sizeof(l));
memset(r,0, sizeof(r));
memset(sum,0, sizeof(sum));
int n,k,q;
scanf("%d%d%d",&n,&k,&q);
int tl,tr;
for (int i =0; i < n; i ++) {
scanf("%d%d",&tl,&tr);
l[tl] ++;
r[tr +1] --;
}
for (int i =1; i < maxn; i ++) {
sum[i] =sum[i - 1] +l[i] + r[i];
}
for (int i =1; i < maxn; i ++) {
if (sum[i] >= k) {
sum[i] =1;
}
elsesum[i] = 0;
}
for (int i =1; i < maxn; i ++) {
sum[i] +=sum[i - 1];
}
for (int i =0; i < q; i ++) {
scanf("%d%d",&tl,&tr);
printf("%d\n",sum[tr] -sum[tl - 1]);
}
return0;
}