Codeforces GYM 100738C Rating Shuffle

传送门:http://codeforces.com/gym/100738/problem/C


ac程序:

//库省略
#define ft first
#define sd second
#define np next_permutation
#define ll long long
#define pb push_back
using namespace std;
ll n,d;
int a[100005];
bool ok;
bool check(ll mid)
{
    ll fir=a[1]+d*mid;
    for(int i=2;i<=n;i++)
    {
        ll t=a[i]+d*mid;
        if(t<fir)
        {
            fir=t;
            continue;
        }
        ll times=(t-fir)/d/2+1;
        if(times>mid)
        {
            return false;
        }
        fir=t-d*times*2;
    }
    return true;
}
int main()
{
    cin>>n>>d;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        if(a[i]>=a[i-1] && !ok)
            ok=true;
    }
    if(!ok)
    {
        cout<<0;
        return 0;
    }
    ll l=0,r=1e18;
    while(l<=r)
    {
        ll mid=(l+r)>>1;
        if(check(mid))
            r=mid-1;
        else
            l=mid+1;
    }
    cout<<l;
    return 0;
}

思路:
首先这是一道裸裸的二分题,单调性明显,主要问题就是数据范围,在10的18的数据范围里二分查找,其实并不用担心,10的18次方也最多只要60次二分就够了,再加上10的5次方的check,只有6*10的6次方,完全是可以过的。

但是我仍然超时了无数次。

罪魁祸首,始作俑者就是cin
原本以为10的5次方的数据范围不需要scanf,结果就是需要,10的5次方的读入再加上后面那个玩意就会超时,所以,我决定
要不以后就只写scanf吧。。。。。。

原文地址:https://www.cnblogs.com/NightRaven/p/9333255.html