原题链接https://codeforces.com/contest/816/problem/Bhttps://codeforces.com/contest/816/problem/B题目大意:有个咖啡配方,每种配方的合适温度为,给出种煮咖啡的方式,输出每种煮的方式符合种配方的整数温度的数量。
解题思路:
差分
差分代码:
int l, r;
for(int i = 0; i < n ;i ++){
scanf("%d%d",&l,&r);
a[l]++;
a[r + 1]--;
}
for(int i = 1;i < N ;i ++){
a[i] += a[i - 1];
}
差分完之后进行递加计算的时候的最差时间复杂度为(TEL的代码)
for(int i = 0;i < q;i ++){
scanf("%d%d",&tl,&tr);
int ans = 0;
for(int j = tl;j <= tr; j++){
if(a[j] >= k)ans ++;
}
printf("%d\n",ans);
}
因此需要对得到的数组再进行处理,方便之后查找,使之后对每种煮咖啡的方式进行查找的时候时间复杂度为
for(int i = 1;i < N ;i ++){
a[i] += a[i - 1];
if(a[i] >= k) ans[i] ++;
ans[i] += ans[i - 1];
}
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MP make_pair
#define SZ(X) ((int)(X).size())
typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f;
const int N = 2e5 + 10;
int a[N],ans[N];
int n, k , q;
int main(){
scanf("%d%d%d",&n,&k,&q);
int l, r;
for(int i = 0; i < n ;i ++){
scanf("%d%d",&l,&r);
a[l]++;
a[r + 1]--;
}
for(int i = 1;i < N ;i ++){
a[i] += a[i - 1];
if(a[i] >= k) ans[i] ++;
ans[i] += ans[i - 1];
}
int tl, tr;
for(int i = 0;i < q;i ++){
scanf("%d%d",&tl,&tr);
printf("%d\n",ans[tr] - ans[tl - 1]);
}
return 0;
}