二分条件要想清楚,题目是找到l到r里的平方数的个数,其实就是在l到r里找0、1、2、3、4.....到31622这些数的平方,可以找左边界假设是x1,要找到满足x1 * x1>=l的第一个数,然后找右边界假设是x2,要找到满足x2 * x2<=r的最后一个数,那么x1到x2之间的数就是l到r之间所有平方数对应的平方根,平方数的个数=x2-x1+1.
然后说一下我遇到的一个问题:
Error on Xcode "No matching function for call to 'max'",这个问题可能是max函数里的两个参数的类型不一致,我又去查了下不同类型的0,0(int),0LL(long long),0UL(unsigned long),0.0(double)。
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
const int N=31625;
int main(){
int n;
cin>>n;
while(n--)
{
ll l,r;
scanf("%lld%lld",&l,&r);
ll l1=0,r1=N;
while(l1<r1)
{
ll mid=l1+r1+1>>1;
if(mid*mid<=r) l1=mid; //找右边界
else r1=mid-1;
}
ll res1=l1;
l1=0,r1=N;
while(l1<r1)
{
ll mid=l1+r1>>1;
if(mid*mid>=l) r1=mid;//找左边界
else l1=mid+1;
}
ll res2=l1;
cout<<res1-res2+1<<endl;
}
return 0;
}