#树状数组模板
global tree
global n,rank
#返回末尾的第一个1的位置
#也就是的到下一个要查询的点的位置
def lowbit(x):
return x&(-x)
def query(x):
ans=0
while x:
ans+=tree[x]
x-=lowbit(x)
return ans
def add(index,k):
while index<=n:
tree[index]+=k
index+=lowbit(index)
n=int(input())
tree=[0]*(n+1)
#rank用于存储离散化后的数组
rank=[0]*(n+1)
arr=[0]*(n+1)
arr[0]=[-float("inf"),-float("inf")]
msg=list(map(int,input().split()))
#按照下标-值存储 从1开始
for i in range(n):
arr[i+1]=[i+1,msg[i]]
arr.sort(key=lambda x:x[1])
#第一个数是最小的 先得到原下标 原下标的对应的rank的值为当前序号
for i in range(1,n+1):
rank[arr[i][0]]=i
ans=0
for i in range(1,n+1):
add(rank[i],1)
ans+=(i-query(rank[i]))
print(ans)
洛谷1908-逆序对-python-(树状数组+离散化)
最新推荐文章于 2023-07-30 17:13:17 发布