Loading

CF1028E题解

首先考虑\(\forall i,b_i=M(1\leq i\leq n)\)这种特殊的情况,显然当且仅当\(M=0\)时有解,证明可以考虑因为是一个环,所以总会存在一个\(a_{i\bmod n}=kM,a_{(i \bmod n)+1}=M(1\leq i < n)\)此时\(b_i=0\)

\(M=\max\limits_{i=1}^n b_i\),然后找到一个下标\(i(1\leq i\leq n)\)满足\(b_{(i-1) \bmod n}<M\)\(b_{i\bmod n}=M\)(这里认为\(b_0=b_n\))。假设这个下标是\(n\),如果不是可以则通过平移数组平移到\(n\)

然后考虑构造\(a\)数组:

\[ a_i=\begin{cases} \sum_\limits{j=i}^{n-1}b_j+2b_n & i<n \\ b_n & i=n \end{cases} \]

这样的\(a\)数组满足所有条件。因为:

  • \(a_n<a_1\)
  • \(a_i-a_{i+1}=b_i(i<n)\)
  • \(b_{i}<a_{i+1}(i<n-1)\)因为\(b_n\)是最大的数,且\(b_n>0\)
  • \(b_{n-1}<b_n=M\)
  • \(b_n<a_1\)因为\(b_n<2b_n\)

以及,如果数组中除了\(1\)都是\(0\),那么\(b_n\)前面的系数\(2\)并没有什么作用,因为此时\(a_n \bmod a_1=0\)。以及事实上可以用\(b_n+10^{10}\)代替\(2b_n\),显然此时构造方法仍然成立。

int n;
int a[155555],b[155555];
int mxv,mxp=-1;
inline int tp(int x)
{
    if(!x) return n;
    return x;
}
signed main()
{
    n=read();
    R(i,1,n) a[i]=b[i]=read();a[0]=b[0]=b[n];
    mxv=*max_element(b+1,b+n+1);
    R(i,1,n) if(b[i]==mxv&&b[i-1]^mxv) {mxp=i;break;}
    if(!~mxp)
    {
        if(!mxv) 
        {
            puts("YES");
            R(i,1,n) writesp(1);puts("");
        }
        else puts("NO");
        return 0;
    }
    a[tp((mxp-1+n)%n)]+=mxv;
    R(i,1,n-1) a[tp((mxp-i+n)%n)]+=a[tp((mxp-i+1+n)%n)];
    puts("YES");
    R(i,1,n) writesp(a[i]);puts("");
}
posted @ 2021-06-29 09:47  yoisaki_hizeci  阅读(81)  评论(0)    收藏  举报