题解 SP10500 HAYBALE - Haybale stacking

前言

想了好久树状数组啥的,后来想想写打个差分再说,结果写完一遍AC了……

强烈安利

题意

一个由 \(n\) 个元素组成的序列,给出 \(k\) 个操作,每次将 \(a\sim b\) 加上 \(1\) ,求这个序列的中位数。

\(\sf {Solution}\)

想用树状数组的直接可以停了。

差分。

差分是什么,前面的blog已经讲得很清楚了。

对于每次操作,区间修改 \(a\sim b\)

修改后,查询区间值,再将数组排序,最终答案就是 \(a_{n/2+1}\)

\(\sf {Code}\)

#include<cstdio>
#include<algorithm>
using namespace std;
int n,k,x,y,w[1000005],a[1000005];
int main()
{
	scanf("%d%d",&n,&k);
	while(k--)
	{
		scanf("%d%d",&x,&y);
		w[x]++;
		w[y+1]--;//区间加
	}
	for(int i=1;i<=n;++i)
		a[i]=a[i-1]+w[i];//查询
	sort(a+1,a+n+1);//排序
	printf("%d",a[n/2+1]);//输出
	return 0;
}
posted @ 2020-08-20 14:15  Callous_Murder  阅读(98)  评论(0编辑  收藏  举报