二分条件要想清楚,题目是找到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;
}