二分(求l-r中的平方数)
Posted lipu123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分(求l-r中的平方数)相关的知识,希望对你有一定的参考价值。
题目描述
多次查询[l,r]范围内的完全平方数个数
定义整数x为完全平方数当且仅当可以找到整数y使得y*y=x
输入描述:
第一行一个数n表示查询次数
之后n行每行两个数l,r
输出描述:
对于每个查询,输出一个数表示答案
第一行一个数n表示查询次数
之后n行每行两个数l,r
输出描述:
对于每个查询,输出一个数表示答案
示例1
输入
5
1 3
1 4
2 4
4 4
1 1000000000
1 3
1 4
2 4
4 4
1 1000000000
输出
1
2
1
1
31622
2
1
1
31622
备注:
n <= 100000
0<= l <= r <= 1000000000
解题思路:暴力肯定会超时,所以很容易想到二分
#include<math.h> #include<stdio.h> #include<algorithm> using namespace std; int a[40000],len; void init(){ len=sqrt(1000000000.0)+1; for(int i=1;i<=len;i++)//先打表 a[i]=i*i; } int binary_search(int key){ int left=0,right=len,mid,ans; while(left<=right){ mid=(left+right)/2; if(a[mid]<=key){ ans=mid; left=mid+1; } else right=mid-1; } return ans; } int main() { init(); int n,l,r; scanf("%d",&n); while(n--) { scanf("%d%d",&l,&r); int x=binary_search(l); printf("%d ",x); int y=binary_search(r); printf("%d ",y); int ans=y-x+1; int t=sqrt(l*1.0); if(t*t!=l) //因为l是不是平方数,对最后结果有影响 ans--; printf("%d ",ans); } return 0; }
以上是关于二分(求l-r中的平方数)的主要内容,如果未能解决你的问题,请参考以下文章