爱思创 180418 Karen and Coffee 题解

180418 Karen and Coffee

题目思路

这道题题是要计算在 \(\left[a_i, b_i\right]\) 间有几个温度在 \(\ge k\) 本食谱中被推荐。

可以使用 差分前缀和 来维护四个数组

第一、二个(c, s)来表示差分数组和前缀和数组,此题来维护某一温度推荐的数量
差分数组用来快速更改某一区间的值(整体增加或减少)
用法是:

c[l] ++;//区间首项加一,表示从这里以上的温度推荐次数加一
c[r + 1] --;//结束“加一”操作

前缀和数组用来从差分数组还原到原数组
用法是:

s[i] = s[i - 1] + c[i];//得到的就是推荐每个温度的数量

第三、四个(b, s2)来表示此温度是否被采纳和某一区间温度可采纳方案的总数(前缀和数组),此题来维护某一区间温度可采纳方案的总数
数组b的用法是:

if(s[i] >= k) b[i] = 1;//如果此温度的推荐数大于等于k,则此温度被采纳

前缀和数组2用来得到前缀和答案
用法是:

s2[i] = s2[i - 1] + b[i];//得到小于等于这个温度的被采纳的温度的数量

最后根据s2数组输出。

完整代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
int s[200005], c[200005], s2[200005];
bool b[200005];
signed main()//我用了 define int long long, 所以只能用 signed main()
{
    int n, l, r, ans = 0, m, k;
    cin >> n >> k >> m;
    for(int i = 1; i <= n; i ++)
    {
        cin >> l >> r;
        c[l] ++;
        c[r + 1] --;
    }
    for(int i = 1; i <= 200001; i ++)//处理每一个温度
    {
        s[i] = s[i - 1] + c[i];
        if(s[i] >= k) b[i] = 1;
        s2[i] = s2[i - 1] + b[i];
    }
    while(m --)
    {
        cin >> l >> r;
        cout << s2[r] - s2[l - 1] << endl;//思路里没细讲的输出,其实就是前缀和最正常的输出
    }
    return 0;
}
posted @ 2022-10-15 19:11  yuzihang  阅读(32)  评论(0)    收藏  举报