B. Karen and Coffee
題意:
有
給你
數據範圍:
思路:
1.看到數據範圍這麼大,一開始我是拒絕的,後來纔想到用前綴和處理區間覆蓋問題。
2.用數組標記左右界,統計前綴和可以得到每個溫度被區間覆蓋的次數。
3.當覆蓋次數大於
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;
}
}