BZOJ 1811 IOI2005 mea

题目大意:有一个单调不降整数序列,定义平均值数列为这个数列的相邻两项的平均值组成的序列,现在给定这个平均值序列,问原序列有多少种

这相当于给定了相邻两项之间的对称轴 那么我将这个数轴沿着这个对称轴折叠 相邻两项在数轴上就重合了

如果将整个数轴沿着所有的对称轴各折叠一次,所有的点就会重合于一点 此时所有对称轴组成的区间的交集大小就是解的数量

注意无解情况

500W的读入还真有人敢传。。。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 5005005
using namespace std;
int n,L=-0x3f3f3f3f,R=0x3f3f3f3f,a[M];
int main()
{
	int i,l=0,r=0;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		if(i&1)
		{
			r=l+(a[i]-a[i-1]);
			R=min(R,r);
		}
		else
		{
			l=r-(a[i]-a[i-1]);
			L=max(L,l);
		}
	}
	cout<<(L>R?0:R-L+1)<<endl;
	return 0;
}


你可能感兴趣的:(bzoj,BZOJ1811,IOI2005)