前缀和--cf816b karen and coffee

来源:互联网 发布:hub网络 编辑:程序博客网 时间:2024/06/07 10:06

已知n,k,q,n组温度l,r,求至少出现k次的温度,q次问询,求问询区间里有多少个满足条件的温度。

前缀和。

用l,r数组标记,每次起点+1,终点 + 1的位置-1,最后求前缀和,则为该温度出现的次数。

将出现大于k次的置为1,否则为0,求前缀和,则为满足条件次数的前缀和,sum[r] - sum[l]可快速求解。

#include <iostream>

#include <cstdio>

#include <cstring>

using namespacestd;

const int maxn =2 *1e5 +5;

int l[maxn],r[maxn],sum[maxn];


int main()

{

    memset(l,0,sizeof(l));

    memset(r,0,sizeof(r));

    memset(sum,0,sizeof(sum));

    

    int n,k,q;

    scanf("%d%d%d",&n,&k,&q);

    int tl,tr;

    for (int i =0; i < n; i ++) {

        scanf("%d%d",&tl,&tr);

        l[tl] ++;

        r[tr +1] --;

    }

    for (int i =1; i <maxn; i ++) {

        sum[i] =sum[i -1] +l[i] +r[i];

    }

    for (int i =1; i <maxn; i ++) {

        if (sum[i] >= k) {

            sum[i] =1;

        }

        elsesum[i] =0;

    }

    for (int i =1; i <maxn; i ++) {

        sum[i] +=sum[i -1];

    }

    for (int i =0; i < q;  i ++) {

        scanf("%d%d",&tl,&tr);

        printf("%d\n",sum[tr] -sum[tl - 1]);

    }

    return0;

}


原创粉丝点击