CF Global Round 10-F

F.Omkar and Landslide

(Description:)

(n)一堆石子,每堆高度为(a_i)(a_i)严格递增,如果某一时刻(a_ile 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;
}
原文地址:https://www.cnblogs.com/huangdalaofighting/p/13518531.html