ARC 135 B

我又来了……

题面

我们有一个数组 $ S_1, S_2, \cdots, S_N $ 。
我们要构造一个数组 $ A_1, A_2, \cdots, A_{N + 2} $ ,使得:

\[\begin{cases} A_1 + A_2 + A_3 = S_1, \\ A_2 + A_3 + A_4 = S_2, \\ \cdots, \\ A_{N} + A_{N + 1} + A_{N + 2} = S_N \end{cases} \]

如果能构造出来,请输出 Yes 以及这个序列;
否则,请输出 No

思路

假设 $ A_1 = a, A_2 = b $ ,那么 $ A_3 = S_1 - a - b $ 。
依照这个,我们可以推算出每一项的常数(记为 $ X_1, X_2, \cdots, X_{N + 2} $)以及未知数(可以发现,是 $ +a, +b, -a-b $ 的周期)。

  • 在第 $ 1, 4, 7, \cdots $ 项中,$ X_i + a \ge 0 $ ,所以 $$ a \ge \max \{ \max \limits _ {1 \le i \le N + 2 且 i \ \bmod \ 3 = 1 } -X_i , 0 \} $$ ,右边的一项记为 $ c_1 $ 。
  • 在第 $ 2, 5, 8, \cdots $ 项中,$ X_i + b \ge 0 $ ,所以 $$ b \ge \max \{ \max \limits _ {1 \le i \le N + 2 且 i \ \bmod \ 3 = 2 } -X_i , 0 \} $$ ,右边的一项记为 $ c_2 $ 。
  • 在第 $ 3, 6, 9, \cdots $ 项中,$ X_i - (a + b) \ge 0 $ ,所以 $$ a + b \le \max \limits _ {1 \le i \le N + 2 且 i \ \bmod \ 3 = 0 } X_i $$ ,右边的一项记为 $ c_3 $ 。

综上(?,我们有

\[\begin{cases} c_1 \le a, \\ c_2 \le b, \\ a + b \le c_3 \end{cases} \]

不符合输出 No ,符合让 $ a = c_1, b = c_2 $ ,再算一算就行了。

代码

#include <bits/stdc++.h>
using namespace std;

long long x[300005]; // constants of a
long long s[300005];

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%lld", &s[i]);
	}
	for (int i = 2; i < n + 2; i++) {
		x[i] = s[i - 2] - x[i - 2] - x[i - 1];
	}
	long long c1 = 0; // a at least to get all numbers to 0 or above
	long long c2 = 0; // b at least to get all numbers to 0 or above
	long long c3 = 1000000000; // a + b at most to get all numbers not under 0
	for (int i = 0; i < n + 2; i += 3) {
		c1 = min(c1, x[i]);
	}
	c1 = -c1;
	for (int i = 1; i < n + 2; i += 3) {
		c2 = min(c2, x[i]);
	}
	c2 = -c2;
	for (int i = 2; i < n + 2; i += 3) {
		c3 = min(c3, x[i]);
	}
	if (c1 + c2 > c3) {
		puts("No");
	} else {
		puts("Yes");
		long long a = c1, b = c2;
		long long add[] = {a, b, - a - b};
		for (int i = 0; i < n + 2; i++) {
			printf("%lld ", x[i] + add[i % 3]);
		}
	}
	return 0;
}
posted @ 2022-12-24 15:06  A-Problem-Solver  阅读(20)  评论(0)    收藏  举报