ARC153C ± Increasing Sequence
ARC153C ± Increasing Sequence
题目大意
给出一个长度为 n n n的序列 A A A, A = ( A 1 , A 2 , … , A n ) A=(A_1,A_2,\dots,A_n) A=(A1,A2,…,An), A i ∈ { 1 , − 1 } A_i\in\{1,-1\} Ai∈{1,−1}。
判断是否存在序列 x = ( x 1 , x 2 … , x n ) x=(x_1,x_2\dots,x_n) x=(x1,x2…,xn),使得序列 x x x满足以下条件:
- 对于所有的 1 ≤ i ≤ n 1\leq i\leq n 1≤i≤n, ∣ x i ∣ ≤ 1 0 12 |x_i|\leq 10^{12} ∣xi∣≤1012
- x x x严格单调递增,即 x 1 < x 2 < ⋯ < x n x_1<x_2<\cdots<x_n x1<x2<⋯<xn
- ∑ i = 1 n A i x i = 0 \sum\limits_{i=1}^nA_ix_i=0 i=1∑nAixi=0
题解
如果直接处理 x x x,因为 x x x严格单调递增,所以会有些麻烦,我们不妨定义序列 y = ( y 1 , y 2 … y n ) y=(y_1,y_2\dots y_n) y=(y1,y2…yn),使得 y y y满足以下条件:
y i = { x 1 , i = 1 x i − x i − 1 , i ≥ 2 y_i= \left\{\begin{matrix} x_1,\qquad\qquad\quad i=1 \\ x_i-x_{i-1},\qquad i\geq 2 \end{matrix}\right. yi={x1,i=1xi−xi−1,i≥2
那么 x i = ∑ k = 1 i y k x_i=\sum\limits_{k=1}^iy_k xi=k=1∑iyk,于是
∑
i
=
1
n
A
i
x
i
=
∑
i
=
1
n
A
i
∑
k
=
1
i
y
k
=
∑
k
=
1
n
(
∑
i
=
k
n
A
i
)
y
k
\sum\limits_{i=1}^nA_ix_i=\sum\limits_{i=1}^nA_i\sum\limits_{k=1}^iy_k=\sum\limits_{k=1}^n(\sum\limits_{i=k}^nA_i)y_k
i=1∑nAixi=i=1∑nAik=1∑iyk=k=1∑n(i=k∑nAi)yk
令
B
k
=
∑
i
=
k
n
a
i
B_k=\sum\limits_{i=k}^na_i
Bk=i=k∑nai,
y
y
y需满足以下条件:
- 对于所有 1 ≤ i ≤ n 1\leq i\leq n 1≤i≤n, ∣ ∑ k = 1 i y k ∣ ≤ 1 0 12 |\sum\limits_{k=1}^iy_k|\leq 10^{12} ∣k=1∑iyk∣≤1012
- 对于所有 2 ≤ i ≤ n 2\leq i\leq n 2≤i≤n, y i > 0 y_i>0 yi>0
- ∑ i = 1 n B i y i = 0 \sum\limits_{i=1}^nB_iy_i=0 i=1∑nBiyi=0
这样,我们就将 x x x严格单调递增的条件变成 y y y的独立的条件。接下来,我们分情况考虑。
情况1: B 1 ≠ 0 B_1\neq 0 B1=0
若 B 1 ≠ 0 B_1\neq 0 B1=0,我们可以构造以下一组解:
y i = { − ∑ i = 2 n B i × ∣ B 1 ∣ B 1 , i = 1 ∣ B 1 ∣ , i ≥ 2 y_i= \left\{\begin{matrix} -\sum\limits_{i=2}^nB_i\times \dfrac{|B_1|}{B_1},\qquad i=1 \\ \\ \qquad\quad |B_1|,\quad\qquad \ \ i\geq 2 \end{matrix}\right. yi=⎩ ⎨ ⎧−i=2∑nBi×B1∣B1∣,i=1∣B1∣, i≥2
此时, y y y显然满足第二个条件和第三个条件。
对于第一个条件,因为
- 当 i = 1 i=1 i=1时, ∣ y i ∣ ≤ n ( n − 1 ) |y_i|\leq n(n-1) ∣yi∣≤n(n−1)
- 当 2 ≤ i ≤ n 2\leq i\leq n 2≤i≤n时, ∣ y i ∣ ≤ n |y_i|\leq n ∣yi∣≤n
所以 ∑ i = 1 n ∣ y i ∣ ≤ 2 × n 2 ≤ 1 0 12 \sum\limits_{i=1}^n|y_i|\leq 2\times n^2\leq 10^{12} i=1∑n∣yi∣≤2×n2≤1012,满足第一个条件。
情况2: B 1 = 0 B_1=0 B1=0
如果 B i ≥ 0 B_i\geq 0 Bi≥0
如果
B
i
≥
0
B_i\geq 0
Bi≥0,因为
B
1
=
0
B_1=0
B1=0,而当
2
≤
i
≤
n
2\leq i\leq n
2≤i≤n时,
y
i
>
0
y_i>0
yi>0,所以
∑
i
=
1
n
B
i
y
i
=
∑
i
=
2
n
B
i
y
i
>
0
\sum\limits_{i=1}^nB_iy_i=\sum\limits_{i=2}^nB_iy_i>0
i=1∑nBiyi=i=2∑nBiyi>0
无法满足题意,所以无解。
如果 B i ≤ 0 B_i\leq 0 Bi≤0
如果 B i ≤ 0 B_i\leq 0 Bi≤0,与 B i ≥ 0 B_i\geq 0 Bi≥0,无法满足题意,所以无解。
其他情况
因为存在 B i B_i Bi大于 0 0 0,也存在 B i B_i Bi小于 0 0 0,又因为 ∣ B i + 1 − B i ∣ = 1 |B_{i+1}-B_i|=1 ∣Bi+1−Bi∣=1,所以一定存在 B p = − 1 , B q = 1 B_p=-1,B_q=1 Bp=−1,Bq=1。
令 X = ∑ i = 2 n B i X=\sum\limits_{i=2}^nB_i X=i=2∑nBi。如果 X ≥ 0 X\geq 0 X≥0,则令
y i = { 1 , i ≠ p 1 + X i = p y_i= \left\{\begin{matrix} \quad 1,\qquad \ \ \ i\neq p \\ 1+X \qquad i=p \end{matrix}\right. yi={1, i=p1+Xi=p
如果 X < 0 X<0 X<0,则令
y i = { 1 , i ≠ q 1 − X i = q y_i= \left\{\begin{matrix} \quad 1,\qquad \ \ \ i\neq q \\ 1-X \qquad i=q \end{matrix}\right. yi={1, i=q1−Xi=q
此时, y y y显然满足第二个条件和第三个条件。
对于第一个条件,因为 ∣ B i ∣ ≤ n |B_i|\leq n ∣Bi∣≤n,所以 ∣ X ∣ ≤ n ( n − 1 ) |X|\leq n(n-1) ∣X∣≤n(n−1), ∑ i = 1 n ∣ y i ∣ ≤ ∣ X ∣ + n ≤ n 2 ≤ 1 0 12 \sum\limits_{i=1}^n|y_i|\leq |X|+n\leq n^2\leq 10^{12} i=1∑n∣yi∣≤∣X∣+n≤n2≤1012,满足第一个条件。
code
#include<bits/stdc++.h>
using namespace std;
int n,v1,v2,a[200005],b[200005];
long long x[200005],y[200005];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=n;i>=1;i--){
b[i]=b[i+1]+a[i];
v1+=(b[i]>=0);
v2+=(b[i]<=0);
}
if(b[1]!=0){
printf("Yes\n");
int f=1;
if(b[1]<0) f=-1;
for(int i=2;i<=n;i++){
y[1]=y[1]-b[i]*f;
y[i]=b[1]*f;
}
for(int i=1;i<=n;i++){
x[i]=x[i-1]+y[i];
printf("%lld ",x[i]);
}
}
else{
if(v1==n||v2==n) printf("No");
else{
printf("Yes\n");
long long t=0;
for(int i=2;i<=n;i++) t+=b[i];
int f=0;
if(t>=0){
for(int i=1;i<=n;i++){
if(b[i]==-1&&!f){
y[i]=1+t;f=1;
}
else y[i]=1;
}
}
else{
for(int i=1;i<=n;i++){
if(b[i]==1&&!f){
y[i]=1-t;f=1;
}
else y[i]=1;
}
}
for(int i=1;i<=n;i++){
x[i]=x[i-1]+y[i];
printf("%lld ",x[i]);
}
}
}
return 0;
}