Codeforces 1392 F. Omkar and Landslide —— 二分,思维

This way

题意:

现在有一个长度为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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值