题意:
现在有一个长度为n的严格上升序列,如果a[i+1]>=a[i]+2,那么a[i+1]-=1,a[i]+=1.重复这个过程直至最后。问你最终吗每个位置的值是多少
题解:
由于他是严格递增的,所以少了很多事情。
设b[i]=a[i]-a[i-1]
对于第i个数,我们可以知道,它一定是从它开始,从后往前将所有b值为0的填掉,于是就有了一个前面b为全1的序列,之后如果还有多的话,那么从1开始往后加就行了。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+5;
ll a[N];
int main()
{
int n;
scanf("%d",&n);
ll sum=0;
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]),sum+=a[i];
ll l=a[1],r=a[n],mid,ans;
while(r>=l){
mid=l+r>>1;
if((mid+n+mid-1)*1ll*n/2<=sum)
l=mid+1,ans=mid;
else
r=mid-1;
}
sum-=(ans+n+ans-1)*1ll*n/2;
for(int i=1;i<=n;i++){
printf("%lld%c",ans+i-1+(sum>0)," \n"[i==n]);
sum--;
}
return 0;
}