cunzai_zsy0531

关注我

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;
}
posted @ 2022-05-28 15:10  cunzai_zsy0531  阅读(13)  评论(0编辑  收藏  举报