Python的bisect.bisect_left和C ++的std :: upper_bound之间的区别

时间:2019-10-04 15:40:38

标签: python c++

我遇到了一个问题:
给定两个由正整数组成的数组X和Y,找出对的数量,使得x ^ y> y ^ x(提高到的幂),其中x是X的元素,y是Y的元素。

我尝试编写以下代码:

#code
import bisect

def pairs(ar1,ar2,n,m):
    count=0
    zeros=ar2.count(0)
    ones=ar2.count(1)
    twos=ar2.count(2)
    threes=ar2.count(3)
    fours=ar2.count(4)
    for x in ar1:
        if x==0:
            continue

        elif x==1:
            count+=zeros
            continue

        idx=bisect.bisect_left(ar2,x)
        if idx<m:
            if ar2[idx]==x:
                count+=m-idx-1
            else:
                count+=m-idx

        count+=zeros+ones

        if x==2:
            count-=threes+fours

        if x==3:
            count+=twos

    return count

但有些测试用例不是
我试图从C ++模仿此代码

int count(int x, int Y[], int n, int NoOfY[])
{
    if (x == 0) return 0;
    if (x == 1) return NoOfY[0];
    int* id = upper_bound(Y, Y + n, x);
    cout << x<<"  "<<*id<<endl;
    int ans = (Y + n) - id;
    ans += (NoOfY[0] + NoOfY[1]);
    if (x == 2)  ans -= (NoOfY[3] + NoOfY[4]);
    if (x == 3)  ans += NoOfY[2];
    return ans;
}
int countPairs(int X[], int Y[], int m, int n)
{
    int NoOfY[5] = {0};
    for (int i = 0; i < n; i++)
        if (Y[i] < 5)
            NoOfY[Y[i]]++;
    sort(Y, Y + n);
    int total_pairs = 0; 
    for (int i=0; i<m; i++)
        total_pairs += count(X[i], Y, n, NoOfY);
    return total_pairs;
}

请帮助

1 个答案:

答案 0 :(得分:1)

摘自bisect_left的文档:

  

返回的插入点i将数组a划分为两半,因此all(val < x for val in a[lo:i])代表左侧,all(val >= x for val in a[i:hi])代表右侧。

摘自upper_bound的文档:

  

返回指向[first, last)范围内第一个元素的迭代器,该元素比value大,如果没有找到这样的元素,则返回last。 / p>

可以这样表示

  

all(val <= x for val in a[lo:i])位于左侧,all(val > x for val in a[i:hi])位于右侧。

请注意,bisect_left使用的是>=,而upper_bound使用的是>

相当于upper_bound的是bisect_right而不是bisect_left