我遇到了一个问题:
给定两个由正整数组成的数组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;
}
请帮助
答案 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