参考了某位大佬写的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)