赛场上写的代码,自己都忘了是怎么想出来的了。如有大佬帮我指点一下万分感谢/bx
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[500005], diff[500005], sum[500005];
void dfs(int x, int n) {
if (x == 1) {
diff[x + 1] += min(a[x], n - x) + 1;
diff[x + min(a[x], n - x) + 1] --;
diff[x] -= min(a[x], n - x);
sum[x] = a[x] = diff[x];
return;
}
dfs(x - 1, n);
a[x] = sum[x - 1] + diff[x];
diff[x + 1] += min(a[x], n - x) + 1;
diff[x + min(a[x], n - x) + 1] --;
diff[x] -= min(a[x], n - x);
sum[x] = sum[x - 1] + diff[x];
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i ++) {
cin >> a[i];
diff[i] = a[i] - a[i - 1];
}
dfs(n, n);
for (int i = 1; i <= n; i ++) {
cout << sum[i] << ' ';
}
return 0;
}