zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Redis主从复制及主从复制的注意事项
    Redis哨兵(Sentinel)
    Redis慢查询日志(slowlog)
    Memcached缓存雪崩现象
    PHP添加Memcached扩展
    Redis节省空间
    Memcached遇到的问题及解决办法
    C++ explicit关键字学习
    力扣:排序之topK||Kth元素的问题
    软聚类
  • 原文地址:https://www.cnblogs.com/iamqzh233/p/9556714.html
Copyright © 2011-2022 走看看