差分:将数列中的每一项与前一项做差来得到一个新的数列
(差分数列最后比原数列多一个数,因为最后一项是0减去原数列的最后一项)
在原数列a中对区间[l,r]中的每一个数都加上x,相当于对差分数列b中 b[l]+=x , b[r+1]-=x
eg: 数列a为 1 2 3 4 5 6
那么a的差分数列b为 1 1 1 1 1 1 -6
所以我们可以得出由差分数列求原数列的公式:
a[n]=b[n]+a[n-1]
由于 b[1]=a[1] 所以 a[2]=b[2]+a[1]=b[2]+b[1]
从而递推出原数列a
根据以上思想写出此题:2041. 干草堆 - AcWing题库
#include<bits/stdc++.h>
using namespace std;
int x[1000010]={0};
int main(){
int n,k;
cin >> n >> k;
for(int i=1;i<=k;i++){
int l,r;
scanf("%d%d",&l,&r);
x[l]++;
x[r+1]--;
}
for(int i=1;i<=n;i++) x[i]+=x[i-1];
sort(x+1,x+1+n);
cout << x[n/2+1];
return 0;
}