Codeforces Round #419 B

B. Karen and Coffee

题意:输入第一行是n k q 分别表示有n个时间段 q个询问,每次询问给出l r 询问l r 时间内 有几个时间点在给出的时间段中出现不小于k次

思路:n个时间段用扫描线处理,询问就是问 l  r区间内有几个时间点在扫描线中的厚度不小于k,求2次前缀和就可以了

AC代码:

#include "iostream"
#include "string.h"
#include "stack"
#include "queue"
#include "string"
#include "vector"
#include "set"
#include "map"
#include "algorithm"
#include "stdio.h"
#include "math.h"
#define bug(x) cout<<x<<" "<<"UUUUU"<<endl;
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
const int N=2e5+100;
int n,k,q,l,r,a,b;
int f[N],sum[N];
int main(){
    scanf("%d%d%d",&n,&k,&q);
    for(int i=1; i<=n; ++i){
        scanf("%d%d",&l,&r);
        f[l]++,f[r+1]--;
    }
    for(int i=2; i<N; ++i){
        f[i]=f[i]+f[i-1];
    }
    if(f[1]>=k) sum[1]++;
    for(int i=2; i<N; ++i){
        if(f[i]>=k){
            sum[i]=sum[i-1]+1;
        }
        else sum[i]=sum[i-1];
    }
    for(int i=1; i<=q; ++i){
        scanf("%d%d",&a,&b);
        printf("%d\n",sum[b]-sum[a-1]);
    }
    return 0;
}

 

posted on 2017-06-28 22:01  lazzzy  阅读(122)  评论(0编辑  收藏  举报

导航