C. Anton and Fairy Tale-Codeforces Round #404 (Div. 2)-二分或者规律

时间:2022-07-04 18:37:39

队友推出的规律,后来百度都是用的二分,自己一想果然也是。
哪知道二分无限wa。
上限取得不一样,结果也不一样。。
m+1,m*2,0x3f3f,0x9f9f,都是一直wa,

后来看的题解,用的2e9。。这样保证平方不会超过结果。(可能因为有平方,要求那个数也不能大于范围吧)
1 2e9是恰好平方不会过long long的。
2 并且,如果天数是2e9的话,那么会把1e18的最大粮食吃掉的
3 最大天数绝不是 m和n。。妈蛋。
综上所述,这道题就是摆明要用二分,都是套路,。。。。
()
因为题目是
顺便科普一下数据范围
unsigned int 0~4294967295
int -2147483648~2147483647
unsigned long 0~4294967295
long -2147483648~2147483647
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:1844674407370955161
__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615

队友代码

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define MOD 1000000007

int main()
{
LL m,n;
while(~scanf("%lld%lld",&n,&m))
{
if(n-m>0)
{LL num=n-m;
LL ans;
LL k=(int)sqrt(2*num);
if(k/2.0*(1+k)>=num)
ans=k+m;
else
{
k++;
ans=k+m;
}
printf("%lld\n",ans);
}
else
{
printf("%lld\n",n);
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{ ll m,n;
scanf("%lld%lld",&m,&n);
if(m<=n)
{printf("%lld",m);return 0;}
else
{ ll r=2e9;
ll l=0;
ll ans=(m-n);
for(int i=1;i<=100;i++)
{ ll mid=(r+l)/2;
if(mid*(mid+1)/2>=ans)
{ r=mid;
}
else
l=mid;
}
cout<<r+n<<endl;
}
return 0;
}