找规律
分两种情况
一个是所有数小于等于H,沙堆高度单调递减。
另一个是沙堆高度先增加后减少。
关键是比赛时候把题看错了。
其实画几个样例就好了。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n,k;
int main() {
cin>>n>>k;
LL t = 1414213563LL;
//cout<<t*(t-1);
if(k>=t || k*(k-1)/2>n) {
LL l = 1,r = min(t,k);
LL ans = 0;
while(l<r) {
LL m = (l+r)/2;
if((m+1)*m/2<n) {
l = m+1;
ans = l;
}
else {
r = m;
ans = r;
}
}
printf("%lld\n",ans);
}
else {
n-=k*(k-1)/2;
LL l = k,r = 2*1e9+7;
LL ans = 0;
while(l<r) {
LL m = (l+r)/2;
if((k+m)*(m-k+1)<n) {
l = m+1;
ans = l;
}
else {
r = m;
ans = r;
}
}
if((k+ans)*(ans-k+1)-ans>=n) ans = 2*ans-k;
else ans = 2*ans-k+1;-
printf("%lld\n",ans);
}
}