之后碰到的陆续加进来
在一个单调的数组vv中判断是否有 l-r的其中一个数。
二分找到 大于等于l 的下标 cc
二分找到大于 r 的下标dd
如果cc==dd那么就不存在
int cc=lower_bound(vv.begin(),vv.end(),l)-vv.begin();
int dd=upper_bound(vv.begin(),vv.end(),r)-vv.begin(); //判断l-r这个区间内是否有k这个质因数。
if(cc==dd) printf("No\n");
else printf("Yes\n");
有多少组a【i】*b【j】>=val
a,b是递增的。
找大于等于val的有多少个了,这里有一种操作,对a数组我们从后往前找,b数组从前往后找。
a数组:n-1 n-2 n-3 .... i+1 i i-1 ... 0
b数组 0 1 2 3 .... j-1 j j+1 .... m-1
当a【i】*b【j】>=val (当位于a【i】时 j为第一个使得a【i】*b【j】>=val的数,也就是说a【i】*b【j-1】<val,我们就break,因为j后面的数肯定都比val大)的时候那么个数等于m-j
下一轮 a【i-1】* b【j-1】肯定也是小于val的那么我们只要从j这个位置开始查找。
复杂度为 O(m+n)。
LL a[maxn],b[maxn];
LL judge(LL val)
{
LL ans=0;
int j=0;
for(int i=n-1;i>=0;i--)
{
for(;j<m;j++)
if(a[i]*b[j]>=val) break;
if(j==m) break;
ans+=(m-j);
}
return ans;
}