题目链接
题目描述
多次查询[l,r]范围内的完全平方数个数
定义整数x为完全平方数当且仅当可以找到整数y使得y*y=x
输入描述:
第一行一个数n表示查询次数 之后n行每行两个数l,r
输出描述:
对于每个查询,输出一个数表示答案
示例1
输入
5
1 3
1 4
2 4
4 4
1 1000000000
输出
1
2
1
1
31622
备注:
n <= 100000 0<= l <= r <= 1000000000
思路:
1.正常暴力枚举会炸
2.考虑将l和r范围内的完全平方数枚举出来存在数组里,再二分查找时间复杂度O(nlogn);
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
const int maxn = 1e5+10;
int n;
ll arr[maxn];
int l, r;
void init() {//初始化完全平方数组
for (ll i = 0; i < maxn; i++) {
arr[i] = i * i;
}
}
int main() {
init();
cin >> n;
while (n--) {
cin >> l >> r;
int x = upper_bound(arr, arr + maxn,r) - arr;
int y = lower_bound(arr, arr + maxn, l) - arr;
cout << x - y << endl;
}
return 0;
}