codeforces1028E: Restore Array

Posted iamqzh233

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于codeforces1028E: Restore Array的主要内容,如果未能解决你的问题,请参考以下文章

[codeforces]#350F. Restore a Number

CodeForces 670F Restore a Number

CodeForces 404C Restore Graph (构造)

Codeforces 1208D Restore Permutation

Codeforces Round #237 (Div. 2) / 404C Restore Graph (构造最短路径树)

Linux 命令(217)—— iptables-restore 命令