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:\)
有两个结论:
- 显然在最后的稳定状态中,高度是递增的(非严格递增)
- 连续的相等的高度不会超过两个
前者很显然
关于后者,做一个简单解释,连续相等的高度超过两个的话就找不到它的上一个状态了,也就是说石子落下来之前的状态都是不合法的。不信的话可以自己把前面的石子往后丢。
那么有这两个条件,在结合原序列是严格递增的,可以推出最后的形态只与石子的总高度有关,再稍微推一下就可以找规律输出了
\(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;
}