

#include<iostream>#include<algorithm>#include<unordered_map>using namespace std;long long a[1000010];unordered_map<long long,long long>mp;bool cmp(long long a,long long b){ return a<b;} int main(){ long long n,q,a1,x,y; cin>>n>>q; for(int i=0;i<n;i++){ scanf("%lld",&a1); a[i]=a1*a1; } sort(a,a+n,cmp); for(int i=0;i<q;i++){ scanf("%lld%lld",&x,&y); long long num=x*x+y*y; int ans=upper_bound(a,a+n,num)-a; printf("%d\n",ans); } return 0;}对于第一类查找,只需要upper_bound(a,a+n,x)-a和lower_bound(a,a+n,x)-a就可以判断
或者手写
主要注意两点if(a【mid】<=k)判断有没有可能是答案,有可能则l=mid没可能则l=mid+1;
判断是(l+r+1)>>1是(l+r)>>1,就是将ans=l带入第一个是mid恒为l一直执行,第二个mid=r终止,同理ans=r时,选第一个。
第二类查找就直接手写
while(l < r){
long long mid = (l + r + 1) >> 1; //因为l=mid,所以在折半取值时,mid应优先取ceil((l+r)/2),避免死循环
if(nums[mid] <= target){
l = mid; //nums[mid]可能为答案
}else{
r = mid - 1;//nums[mid]肯定不是答案了,就将该mid踢出答案所在的[l,r]区间内
}
}
if(nums[l] == target) return l;
return -1;

#include<bits/stdc++.h>#define ll long long#define cin(x) scanf("%d",&x)#define cout(x) printf("%d",x)#define cinll(x) scanf("%lld",&x)#define coutll(x) printf("%lld",x)#define pb(x) push_back(x)using namespace std;const int mod=1e9+7;int pow(int x,int y){ int res=1; for(;y;x=1ll*x*x%mod,y>>=1){ if(y&1)res=1ll*res*x%mod; } return res;}int main(){ int n,m; ll ans=0; cin>>n>>m; for(int i=1;i<=m;i++){ ans = (ans + 1ll *pow(pow(2, i - 1), 2 *n -1) *(pow(2, n) - 1) % mod*pow(2, n -1) % mod *pow(pow(2, m - i), 2 * n)) % mod; } ans=(ans+pow(pow(2,m),2*n-1))%mod; cout<<ans; return 0;}long long 不可以直接%,所以要先开成int型的数组,再用1ll*ans,可以变成ll型且可以求模