我是靠谱客的博主 精明毛豆,最近开发中收集的这篇文章主要介绍Codeforces Round #419 (Div. 2) B. Karen and Coffee【前缀和求区间覆盖次数】,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
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;
}
}
最后
以上就是精明毛豆为你收集整理的Codeforces Round #419 (Div. 2) B. Karen and Coffee【前缀和求区间覆盖次数】的全部内容,希望文章能够帮你解决Codeforces Round #419 (Div. 2) B. Karen and Coffee【前缀和求区间覆盖次数】所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复