Karen and Coffee codeforces 816B

来源:互联网 发布:金融直播软件 编辑:程序博客网 时间:2024/06/05 04:55

题目大意: 给你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;}