序列
有一个非递减的整数序列
S
1
,
S
2
,
S
3
,
…
,
S
n
+
1
(
S
i
≤
S
i
+
1
)
S_1,S_2,S_3,\dots,S_{n+1}(S_i \leq S_{i+1})
S1,S2,S3,…,Sn+1(Si≤Si+1)。定义序列
m
1
,
m
2
,
…
,
m
n
¬
m_1,m_2,\dots,m_n \lnot
m1,m2,…,mn¬为
S
S
S 的
M
M
M 序列,其中
m
i
=
(
S
i
+
S
i
+
1
)
/
2
m_i=(S_i+S_i+1)/2
mi=(Si+Si+1)/2。
例如,
S
=
(
1
,
3
,
3
,
5
)
S=(1, 3, 3, 5)
S=(1,3,3,5),则
m
=
(
2
,
3
,
4
)
m=(2, 3, 4)
m=(2,3,4)。
现在给你序列
m
m
m,要你求有多少个
S
S
S 序列的
M
M
M 序列是序列
m
m
m。
我觉得吧,其实这一道题目个数论的关系并不大,我使用贪心加乱搞写出来了。后来问了一下大佬,知道了其实贪心暴力按照对称轴对折这种找区间大小这么做,其实跟求不等式挂钩的。什么关系呢?也就是说因为只要 S 1 S_1 S1 能够确定下来,其他的数也就都可以确定了,然后我们分类讨论:
- 当 i i i 为奇数时: S i S_i Si 可以表示成 ( M 1 − M 2 + M 3 − . . . + M i − 1 ) × 2 − S 1 (M_1-M_2+M_3-...+M_{i-1})\times 2 - S_1 (M1−M2+M3−...+Mi−1)×2−S1。
- 当 i i i 为偶数是: S i S_i Si 可以表示成 S i = ( − M 1 + M 2 − M 3 + . . . + M i − 1 ) + S 1 S_i=(-M_1+M_2-M_3+...+M_{i-1})+S_1 Si=(−M1+M2−M3+...+Mi−1)+S1。
那么我们就得到了 n n n 个一元一次不等式,直接求解就可以了。但是我个人认为还是贪心对折好理解一点。
#include<bits/stdc++.h>
#define N 1000005
using namespace std;
int a[5000005],n,l,r,L,R;
int main()
{
cin>>n;
l=r=0;
L=-2100000000;
R=-L;
for (int i=1;i<=n;i++)
{
cin>>a[i];
if (i%2)
{
r=l+a[i]-a[i-1];
R=min(R,r);
}
else
{
l=r+a[i-1]-a[i];
L=max(L,l);
}
}
printf("%d\n",max(0,R-L+1));
}