题目大意:有一个单调不降整数序列,定义平均值数列为这个数列的相邻两项的平均值组成的序列,现在给定这个平均值序列,问原序列有多少种
这相当于给定了相邻两项之间的对称轴 那么我将这个数轴沿着这个对称轴折叠 相邻两项在数轴上就重合了
如果将整个数轴沿着所有的对称轴各折叠一次,所有的点就会重合于一点 此时所有对称轴组成的区间的交集大小就是解的数量
注意无解情况
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;
}