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("");
}

浙公网安备 33010602011771号