关于lower_bound和upper_bound:、
lower_bound返回可插入的最小位置的迭代器,即返回第一个符合条件的元素位置。
upper_bound返回可插入的最大位置的迭代器,即返回最后一个符合条件的元素位置。
#include <bits/stdc++.h> typedef long long ll; using namespace std; int main() { int a[10] = {1,2,4,4,6,7,8,8,9}; //第一个大于等于4的位置 cout<<lower_bound(a, a+10, 4)-a<<endl; //第一个大于4的位置或者最后一个等于4的位置。 cout<<upper_bound(a, a+10, 8)-a; return 0; }答案 :
//遍历一遍,记录当中的完全平方数。 //对于每一组查询,找与左边大或等于的最近的完全平方数,找比右边大的第一个位置或等于的最远的完全平方数,然后回到原来的数组里面相减加一即可。 #include <bits/stdc++.h> using namespace std; int a[31622+10]; int main() { int num,l, r; for (int i=0;i<=31625;i++) { a[i] = i; } int n; scanf("%d", &n); while (n--) { scanf("%d %d", &l, &r); int pos1 = lower_bound(a, a+31625, sqrt(l))-a; int pos2 = upper_bound(a, a+31625, sqrt(r))-a; // cout<<pos1<<" "<<pos2<<endl; cout<<max(pos2-pos1,0)<<endl; } return 0; }