传送门: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吧。。。。。。