Beautiful Quadruples

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zjucor/article/details/82793316

https://www.hackerrank.com/challenges/xor-quadruples/problem

https://www.hackerrank.com/challenges/xor-quadruples/editorial

关键点:

1. 把4个数拆成2组,预先计算,而且预先计算是小于x的区间范围(遍历后面那组的时候就会发现要这样才能做到O(NN))

2. 异或有范围,最大4096

3. 先排序,不懂为什么,有人说:order doesn't matter. If you sort a,b,c,d then you can eliminate the need to check for permutations

def beautifulQuadruples(a, b, c, d):
    res=0
    
    total_=[0]*(1+b)
    for i in range(1,b+1): total_[i]=min(i,a)
    total=[0]*(1+b)
    for i in range(1,b+1): total[i]=total[i-1]+total_[i]
    for i in range(1,c+1): res+=total[min(i,b)]*max(0,d-i+1)
#    print(res)
    
    cnt_=[[0 for _ in range(4097)] for _ in range(1+b)]
    for i in range(1,a+1):
        for j in range(i,b+1):
            cnt_[j][i^j]+=1
    cnt=[[0 for _ in range(4097)] for _ in range(1+b)]
    for j in range(4097):
        for i in range(1,1+b):
            cnt[i][j]=cnt[i-1][j]+cnt_[i][j]
    
    for i in range(1,c+1):
        for j in range(i,d+1):
            res-=cnt[min(i,b)][i^j]
    return res

if __name__ == '__main__':
    abcd = list(map(int,input().strip().split(' ')))
    abcd.sort()
    a = int(abcd[0])
    b = int(abcd[1])
    c = int(abcd[2])
    d = int(abcd[3])
    result = beautifulQuadruples(a, b, c, d)
    print(result)

猜你喜欢

转载自blog.csdn.net/zjucor/article/details/82793316