1. 程式人生 > 其它 >CF1392F Omkar and Landslide 題解

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;
}