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+1]<=a[i+2]+1的,此时a[i+1]+1<=a[i+2],于是就不会出现两个同时存在的相同的位置,一开始是严格递增没有相邻位置相同的,出现一个相同的也最多只有一对,因为出现一对相同的必定使另外一对相同的变得不同
接下来就是水题了,算一下基准值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;
}