Karen and Coffee codeforces 816B
题目大意: 给你n种咖啡的烹调方法,每种都包含了该种方法的咖啡的适宜温度,从l 到r,现在需要的咖啡至少满足k种烹调方法, 在q个询问中,每个区间[a,b]中有多少个适宜的咖啡
这道题目,n q给的是200000 显然不可能用n²的方法过,因此这道题应该用前缀和相减来做
思路:我们要知道有多少个适宜的咖啡,我们可以想到对应每种温度之前所有满足的咖啡的个数,那么只要相减,就能得到区间内的符合条件的个数
但是怎么得到每种温度对应的呢? 这就需要再用一次前缀和处理之前烹调方法,对于某一方法 [l ,r] 标记第l位为1,第r+1位为-1, 最后用前缀和处理,就可以了;
ac代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;
const int maxn = 200000+5;
int vis[212345];
int T,n,m;
int v[212345];
int main()
{
int q,k;
scanf("%d%d%d",&n,&k,&q);
memset(vis,0,sizeof(vis));
memset(v,0,sizeof(v));
for(int i=1;i<=n;i++)
{
int l,r;
scanf("%d%d",&l,&r);
vis[l]++;
vis[r+1]--;
}
for(int i=1;i<=maxn;i++)
{
vis[i]+=vis[i-1];
// printf("%d ",vis[i]);
if(vis[i]>=k)v[i]=1;
}
// cout<<endl;
for(int i=1;i<=maxn;i++)
{
v[i]=v[i-1]+v[i];
// printf("%d ",v[i]);
}
for(int i=1;i<=q;i++)
{
int s,t;
scanf("%d%d",&s,&t);
int ans=v[t]-v[s-1];
printf("%d\n",ans);
}
return 0;
}