CF1392F Omkar and Landslide 题解
由于一开始的序列中没有两个相同的 \(h\),猜测最终的序列中 \(h_i=h_{i+1}\) 的位置最多只有一个。大概可以这样感性理解:考虑从左到右做“滑坡”,如果之前 \(h_i=h_{i-1}\),那么后面要么 \(h\) 都不相同,要么有一个位置相同了会带动一段都 \(+1\),导致 \(h_i\not= h_{i-1}\),无论如何只能有一个位置是相同的。
那这样就很好办了,可以证明任意一个 \(\sum h_i\) 都一一对应了一个序列。首先考虑没有相邻位置相同的情况,通过 \(\sum h_i=\frac{n(2b_1+n-1)}2\) 求出开头的值 \(b_1\),根据这个值找有没有相邻位置相同的数就可以了。
点击查看代码
int main(){
int n;
read(n);ll sum=0;
for(int i=1;i<=n;++i){
ll x;read(x);
sum+=x;
}
ll tmp=(sum*2-1)/n+1;
tmp=(tmp-(n-1)+1)/2;
if(n*(2*tmp+n-1)/2==sum){
for(int i=1;i<=n;++i) print(tmp+i-1),print(' ');
return 0;
}
ll ttmp=sum-(n-1)*(2*tmp+n-2)/2;
ll j=tmp;
for(int i=1;i<n;++i,++j){
print(j),print(' ');
if(j==ttmp) print(j),print(' ');
}
return 0;
}