B. Karen and Coffee
题意:
有
n
个专家给你推荐咖啡合适温度范围
给你
数据范围:
1≤k≤n≤200000
,
1≤q≤200000
,
1≤l≤r≤200000
,
1≤a≤b≤200000
思路:
1.看到数据范围这么大,一开始我是拒绝的,后来才想到用前缀和处理区间覆盖问题。
2.用数组标记左右界,统计前缀和可以得到每个温度被区间覆盖的次数。
3.当覆盖次数大于
k
的时候,说明这个温度是合理的,标记为1,否则为0。
4.再统计一次前缀和,就可以得到
5.接下来每次询问你懂的。
代码:
#include <bits/stdc++.h>
using namespace std;
int a[200200];
int sum[200200];
int main() {
int n, k, q;
int x, y;
scanf("%d%d%d", &n, &k, &q);
memset(a, 0, sizeof(a));
for(int i = 0; i < n; i++) {
scanf("%d%d", &x, &y);
a[x]++;
a[y + 1]--;
}
int tot = 0;
//统计前缀和,当前缀和>=k时,说明该温度满足条件,记该温度为1
for(int i = 0; i < 200100; i++) {
tot += a[i];
a[i] = (tot >= k ? 1 : 0);
}
//再统计一下前缀和,就可以在O(1)时间内查询一段区间满足条件的个数了
sum[0] = a[0];
for(int i = 1; i < 200100; i++) {
sum[i] = sum[i-1] + a[i];
}
while(q--) {
scanf("%d%d", &x, &y);
cout << sum[y] - sum[x-1] << endl;
}
}