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 1in ∣ x i ∣ ≤ 1 0 12 |x_i|\leq 10^{12} xi1012
  • 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=1nAixi=0

题解

如果直接处理 x x x,因为 x x x严格单调递增,所以会有些麻烦,我们不妨定义序列 y = ( y 1 , y 2 … y n ) y=(y_1,y_2\dots y_n) y=(y1,y2yn),使得 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=1xixi1,i2

那么 x i = ∑ k = 1 i y k x_i=\sum\limits_{k=1}^iy_k xi=k=1iyk,于是

∑ 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=1nAixi=i=1nAik=1iyk=k=1n(i=knAi)yk
B k = ∑ i = k n a i B_k=\sum\limits_{i=k}^na_i Bk=i=knai y y y需满足以下条件:

  • 对于所有 1 ≤ i ≤ n 1\leq i\leq n 1in ∣ ∑ k = 1 i y k ∣ ≤ 1 0 12 |\sum\limits_{k=1}^iy_k|\leq 10^{12} k=1iyk1012
  • 对于所有 2 ≤ i ≤ n 2\leq i\leq n 2in 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=1nBiyi=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=2nBi×B1B1,i=1B1,  i2

此时, y y y显然满足第二个条件和第三个条件。

对于第一个条件,因为

  • i = 1 i=1 i=1时, ∣ y i ∣ ≤ n ( n − 1 ) |y_i|\leq n(n-1) yin(n1)
  • 2 ≤ i ≤ n 2\leq i\leq n 2in时, ∣ y i ∣ ≤ n |y_i|\leq n yin

所以 ∑ 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=1nyi2×n21012,满足第一个条件。


情况2: B 1 = 0 B_1=0 B1=0

如果 B i ≥ 0 B_i\geq 0 Bi0

如果 B i ≥ 0 B_i\geq 0 Bi0,因为 B 1 = 0 B_1=0 B1=0,而当 2 ≤ i ≤ n 2\leq i\leq n 2in时, 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=1nBiyi=i=2nBiyi>0

无法满足题意,所以无解。

如果 B i ≤ 0 B_i\leq 0 Bi0

如果 B i ≤ 0 B_i\leq 0 Bi0,与 B i ≥ 0 B_i\geq 0 Bi0,无法满足题意,所以无解。

其他情况

因为存在 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+1Bi=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=2nBi。如果 X ≥ 0 X\geq 0 X0,则令

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=q1Xi=q

此时, y y y显然满足第二个条件和第三个条件。

对于第一个条件,因为 ∣ B i ∣ ≤ n |B_i|\leq n Bin,所以 ∣ X ∣ ≤ n ( n − 1 ) |X|\leq n(n-1) Xn(n1) ∑ 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=1nyiX+nn21012,满足第一个条件。

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;
}
  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值