本题一共存在4种序列, 他们的平均数序列都是2,3,9。这四种序列如下:
* 2,2,8,10
* 1,3,7,11
* 0,4,6,12
*-1,5,5,13
分析:
sequence序列:
令S序列的第一项为k,那么后面几项就可以写成关于k的多项式:
S1=k
S2=2*m1-k
S3=2*m2-2*m1+k „„
然后根据S序列的非递减性质,有S1<=S2<=S3<=….
所以有
k<=2*m1-k
2*m1-k<=2*m2-2*m1+k
„„
可以得到n个关于k的不等式,而且都是有规律的,可以在O(n)的时间内解出形如 a<=k<=b 的结果。
由于k的值和S序列是一一对应的,所以k的取值的个数(b-a)就是满足要求的S序列的个数。
这个题解一开始看起来有点费劲,什么有规律的,我怎么没发现。
写前面的一些项,帮助发现规律吧。
S1+S2 = m1
S2 + S3 = m2
S3 + S4 = m3
s4 + s5 = m4
令S1 = k,则
S1 = k
S2 = 2*m1 - k;
S3 = 2*m2 - 2*m1 + k
S4 = 2*m3 - 2*m2 + 2*m1 - k
S5 = 2*m4 - 2*m3 + 2*m2 - 2*m1 + k
根据S1 <= S2 <= S3 <= S4 <= S5,则有
S1 <= S2 ----> k < 2*m1 - k ----> k < m1
S2 <= S3 ----> 2*m1 - k < 2*m2 - 2*m1 + k ----> k > 2*m1 - m2
S3 <= S4 ----> k < m3 - 2*m2 + 2*m1
S4 <= S5 ----> k > 2*m3 - 2*m2 + 2*m1 - m4
可以发现<和>是交替的
那么就可以根据整理出的不等式,求出k的上下界。
#include
#include
using namespace std;
typedef long long LL;
const int N = 5e6+5;
int b[N];
LL a[N];
int main()
{
int n;
while(cin >> n)
{
LL ma = 1ll<<61, mi = -(1ll<<61);
for(int i = 1; i <= n; i++)
scanf("%d", &b[i]);
a[0] = 0;
for(int i = 1; i <= n; i++)
a[i] = b[i] - a[i-1]; //a[1] = m1, a[2] = m2-m1, a[3] = m3-m2+m1, a[4] = m4-m3+m2-m1;
for(int i = 0; i < n; i += 2)
{
LL k = a[i+1] - a[i];
if(k < ma) //用来求最小的上界
ma = k;
}
for(int i = 1; i < n; i += 2)
{
LL k = a[i] - a[i+1];
if(k > mi) //用来求最大的下界
mi = k;
}
if(ma >= mi)
printf("%Illd\n", ma - mi +1);
else
puts("0");
}
return 0;
}