题意:
求有多少个不下降的整数队列,他们相邻的值等于题目要求的值。
题解:
不难发现,只要第一个数确定,后面的数都能知道了。
所以是确定第一个数的范围。
设是x,将序列M都*2,后面依次是
M1−x,M2−M1+x,M3−M2+M1−x…
所以将新的常数计算出来,解n个不等式就行了。
要long long,inf要够大。
code:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#define LL long long
using namespace std;
LL a[5000010],n;
const LL inf=(1LL<<60);
LL calc(LL x)
{
if(x%2==0) return x/2;
if(x>0) return (x+1)/2;
if(x<0) return (x-1)/2;
}
int main()
{
scanf("%lld",&n);
for(LL i=1;i<=n;i++)
{
LL M;scanf("%lld",&M);
M*=2;
a[i+1]=M-a[i];
}
LL l=-inf,r=inf;
for(LL i=1;i<=n;i++)
{
if(i&1)
r=min(r,(a[i+1]-a[i])/2);
else
l=max(l,calc(a[i]-a[i+1]));
}
if(l>r) printf("0");
else printf("%lld",r-l+1);
}