0
点赞
收藏
分享

微信扫一扫

2022AcWing寒假算法每日一题之2041. 干草堆

Xin_So 2022-01-20 阅读 43

2022AcWing寒假算法每日一题之2041. 干草堆

题目链接:AcWing2041. 干草堆

思路:

1.在A~B之间加上一个常数,如果一般暴力循环遍历相加会TLE,则考虑差分算法

差分相加算法一般过程: h[i]=s[i]-s[i-1]; h[a]+=c; h[b+1]-=c;a为左边界,b为右边界,c为常数,s[i]为一维数组

再利用前缀和算法得到a~b之间的值

注意:差分算法一般伴随着前缀和算法,利用前缀和算法得到各个位置的值

2.最后排序再找到中间值即可

具体代码:

#include <iostream>
#include <math.h>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e6+10;
int n,k;
int h[N];//差分
int x[N];//前缀和
int main()
{
    cin>>n>>k;
    for(int i=1;i<=k;i++)
    {
        int a,b;
        cin>>a>>b;
        //差分操作
        h[a]+=1;
        h[b+1]-=1;
    }
    for(int i=1;i<=n;i++)
    {
        x[i]+=x[i-1]+h[i];//前缀和求出每个位置的值
    }
    sort(x+1, x+1+n);//排序
    cout<<x[(n+1)/2]<<endl;//输出中间值
    return 0;
}
举报

相关推荐

0 条评论