https://codeforces.com/problemset/problem/1392/F
这题的关键是观察出无论何时,至多只有一对是相同值的
考虑没有相同值的时候,如果某个时刻出现了a[i]+2=a[i+1]的时候,假设a[i-1]和a[i+2]都无法滑坡了,那么此时会出现a[i]=a[i+1]
但是由于滑落之前a[i+2]-a[i+1]等于0或1(a[i+2]此时无法降到a[i+1],只能a[i+1]滑落到a[i]),此时a[i+2]-a[i+1]>=1,于是就不会出现两个同时存在的相同的位置,a[i-1]也是如此。一开始是严格递增没有相邻位置相同的,出现一个相同的也最多只有一对,因为出现一对相同的必定使另外一对相同的变得不同
接下来就是水题了,算一下基准值base然后把1-n变成base,base+1...base+n-1这样,剩余没分完的说明有相同的位置,那么加到1-sum%n这些位置上就行了。
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
const int maxl=1e6+10;
int n,m,cas,k,cnt,tot;
ll a[maxl],b[maxl],ans[maxl];
char s[maxl];
bool in[maxl];
inline void prework()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
}
inline void mainwork()
{
ll sum=0;
for(int i=1;i<=n;i++)
sum+=a[i]-i+1;
for(int i=1;i<=n;i++)
ans[i]=i-1+sum/n;
int up=sum%n;
for(int i=1;i<=up;i++)
ans[i]++;
}
inline void print()
{
for(int i=1;i<=n;i++)
printf("%lld ",ans[i]);
}
int main()
{
int t=1;
//scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}