codeforces1028E: Restore Array

小清新构造题。

选择一个位置$b_{i-1}<b_i且b_i=max_b$,然后把这个位置循环位移到$n$。

然后构造$a_n=b_n$。

$a_i=\sum_{j=i}^{n-1}b_j+2*b_n$。

带回去检验一下,发现是对的。

思路大概就是往$a_i-a_{i+1}=b_i$的方向想吧。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define M 150000
 4 #define LL long long
 5 #define Next(x) x % n + 1
 6 #define pre(x) (x == 1 ? n : x - 1)
 7 int b[M], c[M];
 8 LL a[M];
 9 int n;
10 int main() {
11     scanf("%d", &n);
12     for(int i = 1; i <= n; ++ i) {
13         scanf("%d", &b[i]);
14     }
15     b[0] = -1;
16     int mx = 0;
17     for(int i = 1; i <= n; ++ i) {
18         if(b[i] > b[mx] && b[pre(i)] < b[i]) {
19             mx = i;
20         }
21     }
22     if(mx == 0) {
23         if(b[1] != 0) puts("NO");
24         else {
25             puts("YES");
26             for(int i = 1; i <= n; ++ i) {
27                 printf("1 ");
28             }
29             puts("");
30         }
31         return 0;
32     }
33     int st;
34     mx = Next(mx);
35     for(int i = 1; i <= n; ++ i, mx = Next(mx)) {
36         if(mx == 1) st = i;
37         c[i] = b[mx];
38     }
39     a[n] = c[n];
40     a[n - 1] = 2 * c[n] + c[n - 1];
41     for(int i = n - 2; i >= 1; -- i) {
42         a[i] = a[i + 1] + c[i];
43     }
44     puts("YES");
45     for(int i = st, j = 1; j <= n; ++ j, i = Next(i)) {
46         printf("%lld ", a[i]);
47     }
48 }

 

posted @ 2018-08-29 20:43  iamunstoppable  阅读(249)  评论(0编辑  收藏  举报