1 条题解
-
0
自动搬运
来自洛谷,原作者为

BqtMtsZDnlpsT
**搬运于
2025-08-24 22:14:56,当前版本为作者最后更新于2021-07-14 21:27:07,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
思维题。
首先我们考虑,知道了 就能根据 推出 的值,知道了 就能根据 推出 的值,以此类推,所以,知道一个符合范围的 ,就能求出一个解,具体如下。
$(S_1+S_2)\div 2=M_1\longrightarrow S_2=2\times M_1-S_1$
$(S_2+S_3)\div 2=M_2\longrightarrow S_3=2\times M_2-S_2$
$(S_3+S_4)\div 2=M_1\longrightarrow S_4=2\times M_3-S_3$
$(S_i+S_{i+1})\div 2=M_1\longrightarrow S_{i+1}=2\times M_{i}-S_{i}$
把 分别用 表示得:
$S_i=\left\{\begin{matrix} 2\times(M_1-M_2+M_3-M_4+\cdot\cdot\cdot+M_{i-1})-S_1 & (i \bmod 2=0)\\ 2\times(-M_1+M_2-M_3+\cdot\cdot\cdot+M_{i-1})+S_1 & (i \bmod 2=1) \end{matrix}\right.$
即 $S_i=\left\{\begin{matrix} 2\times(M_1-M_2+M_3-M_4+\cdot\cdot\cdot+M_{i-1})-S_1 & (i \bmod 2=0)\\ -2\times(M_1-M_2+M_3-M_4+\cdot\cdot\cdot-M_{i-1})+S_1 & (i \bmod 2=1) \end{matrix}\right.$
此时,在题目中我们发现一个还没用过的东西:。
于是我们考虑对于每个 把 、 带入不等式。
$S_1\le S_2 \longrightarrow S_1\le2\times M_1-S_1 \longrightarrow S_1\le M_1$
$S_2\le S_3 \longrightarrow 2\times M_1-S_1 \le 2\times(M_2- M_1)+S_1 \longrightarrow 2\times(2\times M_1-M_2)\le 2\times S_1 \longrightarrow 2\times M_1-M_2\le S_1$
就像这样,我们可以得到式子:
$S_{i}\le S_{i+1} \longrightarrow \left\{\begin{matrix} S_1\ge 2\times(M_1-M_2+M_3-M_4+\cdot\cdot\cdot+M_{i-1})-M_{i} & (i \bmod 2=0)\\ S_1\le 2\times (M_1-M_2+M_3-M_4+\cdot\cdot\cdot-M_{i-1})+M_i& (i \bmod 2=1) \end{matrix}\right.$
然后就可以根据每个 的不等式得到一个关于 不等式组,解出这个不等式组即为 的取值范围,得到 的取值范围后,因为确定 即可确定一组解,所以 的取值范围中整数个数即为所求。
对于这个不等式组,我们发现可以前缀和处理,然后对于奇数的 更新答案区间右端点,对于偶数的 更新答案区间左端点,设左端点为 ,右端点为 ,答案即为 ,但是考虑不等式组无解,不能输出负数,应输出
0。代码(很短):
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #define int long long using namespace std; int n,l,r,s[5000005],m[5000005]; signed main() { scanf("%lld",&n); l=-9223372036854775807,r=9223372036854775807; for(int i=1;i<=n;i++)scanf("%lld",&m[i]); for(int i=1;i<=n;i++){//前缀和 if(i&1)s[i]=s[i-1]+m[i]; else s[i]=s[i-1]-m[i]; } for(int i=1;i<=n;i++){//求左、右端点 if(i&1)r=min(r,(s[i-1]<<1ll)+m[i]); else l=max(l,(s[i-1]<<1ll)-m[i]); } printf("%lld",max(r-l+1,0ll)); return 0; }
- 1
信息
- ID
- 4853
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者