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;
}

浙公网安备 33010602011771号