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;
}