1. 程式人生 > 實用技巧 >CF Global Round 10-F

CF Global Round 10-F

F.Omkar and Landslide

\(Description:\)

\(n\)一堆石子,每堆高度為\(a_i\)\(a_i\)嚴格遞增,如果某一時刻\(a_i\le a_{i+1}-2\),則下一時刻\(a_i\)的高度\(+1\)\(a_{i+1}\)的高度\(-1\)

問最後穩定的狀態

\(Solution:\)

有兩個結論:

  1. 顯然在最後的穩定狀態中,高度是遞增的(非嚴格遞增)
  2. 連續的相等的高度不會超過兩個

前者很顯然

關於後者,做一個簡單解釋,連續相等的高度超過兩個的話就找不到它的上一個狀態了,也就是說石子落下來之前的狀態都是不合法的。不信的話可以自己把前面的石子往後丟。

那麼有這兩個條件,在結合原序列是嚴格遞增的,可以推出最後的形態只與石子的總高度有關,再稍微推一下就可以找規律輸出了

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
typedef long long lol;
lol n,x,sum;
lol read(){
	lol ans=0,f=1;char i=getchar();
	while(i<'0'||i>'9'){if(i=='-')f=-1;i=getchar();}
	while(i>='0'&&i<='9'){ans=ans*10+i-'0';i=getchar();}
	return ans*f;
}
void write(lol x){
	if(x<0){putchar('-');x=-x;}
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
int main(){
	n=read();
	for(int i=1;i<=n;i++)x=read(),sum+=x;
	sum-=n*(n-1)/2;
	lol ave=sum/n,rest=sum%n;
	for(int i=1;i<=n;i++){
		write(i-1+ave+(i<=rest));
		putchar(' ');
	}
	puts("");
	return 0;
}