C++ 二进制数组的查询应答

C++ 二进制数组的查询应答,c++,arrays,algorithm,intervals,C++,Arrays,Algorithm,Intervals,给定一个长度的二进制数组,您可以使用空间复杂度和每个查询的Ologn搜索时间来完成。计算大小为1、2、4…的窗口的计数。。。。对于给定的查询,您最多可以找到两个特定大小的Ologn窗口,求和即可找到您的答案。正如Dukeling在评论中所说,您可以在On中预处理以计算数组B,其中B[x]包含[1..r]中看到的连续数字总数 这允许O1中的查询通过使用数组计算[1,r]范围内的总数并减去[1,l]范围内的数字来查找[l,r]范围内的连续位数 Python代码: def preprocess(A):

给定一个长度的二进制数组,您可以使用空间复杂度和每个查询的Ologn搜索时间来完成。计算大小为1、2、4…的窗口的计数。。。。对于给定的查询,您最多可以找到两个特定大小的Ologn窗口,求和即可找到您的答案。

正如Dukeling在评论中所说,您可以在On中预处理以计算数组B,其中B[x]包含[1..r]中看到的连续数字总数

这允许O1中的查询通过使用数组计算[1,r]范围内的总数并减去[1,l]范围内的数字来查找[l,r]范围内的连续位数

Python代码:

def preprocess(A):
    last=A[0]
    B=[0,0]
    num_consecutive=0
    for a in A[1:]:
        if a==last:
            num_consecutive+=1
        B.append(num_consecutive)
        last=a
    return B

def query(B,l,r):
    return B[r]-B[l]

A=[0,1,1,0,0,0]
B=preprocess(A)

print query(B,1,3)
print query(B,5,6)
print query(B,1,5)
print query(B,3,6)
print query(B,3,4)

这闻起来像家庭作业。你自己也试过吗?@Bojangles:我可以向你保证,这不是一个家庭作业,也不像看上去那么琐碎。我已经更新了我的答案。我不明白你在找什么。以最后两个查询为例。范围[3,6]中的元素是000。有三个连续的零,那么为什么答案是2?范围[3,4]中的元素是0。有一个连续的零,那么为什么答案是0?作为旁注-从查询中,看起来范围是[l,r],而不是[l,r.这不太难-在设置时间,O1查询,但我想先看看你们方面的尝试。@Dukeling:我知道这不太难,只是我不明白:/