题目:
蒜头君想泡咖啡喝。现在他得到了 nn 份菜谱,每个菜谱上都给了两个数l,rl,rl,r代表温度区间在[l,r][l,r][l,r] 度泡出来的咖啡会很好喝。
可是菜谱太多了,蒜头君一度感到疑惑。经过思考之后他得出了一个结论:某个温度只要有 k 份或者更多菜谱推荐,那么这个温度下泡出来的咖啡会很好喝。
现在他给出了 m 个温度区间,同样还是用 [l,r][l,r][l,r]表示,现在求问每个区间里面有多少个整数,使得咖啡在这个温度下泡出来会很好喝?
输入格式
第一行为三个整数 n,k,m。
第 2∼n+12\sim n+12∼n+1 行,每行两个整数,代表菜谱里面的 l,r。
第 n+2∼n+m+1n+2\sim n+m+1n+2∼n+m+1 行,每行两个整数,代表待询问温度区间里面的 l,r。
输入的所有数都是正整数且不超过 2×1052\times 10^52×105 ,且满足 l≤r,k≤nl\le r,k\le nl≤r,k≤n。
输出格式
对于每个询问输出一行,为一个整数,表示有多少可用的温度。
输出时每行末尾的多余空格,不影响答案正确性
要求使用「文件输入输出」的方式解题,输入文件为 coffee.in,输出文件为 coffee.out
样例输入1
3 2 4
91 94
92 97
97 99
92 94
93 97
95 96
90 100
样例输出1
3
3
0
4
样例输入2
2 1 1
1 1
200000 200000
90 100
样例输出2
0
分析:
前缀和优化
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;const int N=2e5+10;int a[N],sum[N];int main()
{freopen("coffee.in", "r", stdin);freopen("coffee.out", "w", stdout);int n,m,k;scanf("%d%d%d",&n,&k,&m);for(int i=0; i<n; ++i){int t1,t2;scanf("%d%d",&t1,&t2);++a[t1]; --a[t2+1];}for(int i=1; i<N; ++i){a[i]=a[i]+a[i-1];if(a[i]>=k) ++sum[i];sum[i]+=sum[i-1];}while(m--){int l,r;scanf("%d%d",&l,&r);printf("%d\n",sum[r]-sum[l-1]);}return 0;
}