蓝桥杯 逆序对 python

参考了某位大佬写的C++,照着改成了python,但是只拿了16分就是说。。。

(中间有一些测试用的代码,都注释掉了)

index = 1
ans = 0
S = [0]*200001
left = [0]*200001
right = [0]*200001
key = [0]*200001
def rRotate(t):
    tem = left[t]
    left[t] = right[tem]
    right[tem] = t
    S[t] = S[left[t]]+S[right[t]]+1
    S[tem] = S[left[tem]]+S[right[tem]]+1
    return tem
def lRotate(t):
    tem = right[t]
    right[t] = left[tem]
    left[tem] = t
    S[t] = S[left[t]]+S[right[t]]+1
    S[tem] = S[left[tem]]+S[right[tem]]+1
    return tem
def adjust(t,flag):
    if flag == 1:
        if S[left[left[t]]]>S[right[t]] or S[right[left[t]]]>S[right[t]]:
            if S[left[right[t]]]>S[right[t]]:
                left[t] = lRotate(left[t])
            return rRotate(t)
    else:
        if S[right[right[t]]]>S[left[t]] or S[left[right[t]]]>S[left[t]]:
            if S[left[right[t]]] > S[left[t]]:
                right[t] = rRotate(right[t])
            return lRotate(t)
    return t
def insert(t,node):
    S[t]+=1
    if key[node]<key[t]:
        if left[t] == 0:
            left[t] = node
        else:
            left[t] = insert(left[t],node)
    else:
        if right[t] == 0:
            right[t] = node
        else:
            right[t] = insert(right[t],node)
    return adjust(t,key[node]<key[t])
def rank(t,val): #返回t为根节点的树上比val大的节点个数
    result = 0 #新
    if key[t] == 0:
        return result
    if val>key[t]:
        result += rank(right[t],val)
    else:
        result += rank(left[t],val)+1+S[right[t]]
    return result
def merge(node,begin,end):
    lens = 0
    rans = 0
    global ans
    # print(node, begin, end)
    for i in range(begin,end):
        tem = rank(node,key[i])
        # print("tem",tem)
        lens += tem
        rans += S[node]-tem
        # print("lens,rans,ans", lens, rans, ans)
    ans += min(lens,rans)
    # print("lens,rans,ans",lens,rans,ans)
    for i in range(begin,end):
        # print("插入前:node", node)
        # print("      lfnode", left[node])
        # print("      rtnode", right[node])
        left[i] = right[i] = 0
        S[i] = 1
        node = insert(node,i)
        # print("插入后:node", node)
        # print("      lfnode", left[node])
        # print("      rtnode", right[node])
        # print("      llfnode", left[left[node]])
        # print("      lrfnode", right[left[node]])
        # print("      rlfnode", left[right[node]])
        # print("      rrtnode", right[right[node]])
    return node
def buildtree():
    val = int(input())
    global index
    if val != 0:
        left[index] = right[index] = 0
        S[index] = 1
        key[index] = val
        index += 1
        return index-1
    a = index
    lt = buildtree()
    # print("lt",lt)
    b = index
    rt = buildtree()
    # print("rt",rt)
    c = index
    if (b-a)>(c-b):
        return merge(lt,b,c)
    else:
        return merge(rt,a,b)

n = input()
buildtree()
print(ans)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值