#!/usr/bin/python
def countsplit(l,r) :
l = sorted(l)
r = sorted(r)
i = 0
j = 0
c = 0
while(i < len(l) and j < len(r)) :
if(l[i] <= r[j]) :
i+=1
else :
c+=len(l)-i
j+=1
return c
def count(array) :
if len(array) == 1 :
return 0
l = array[0:len(array)/2]
r = array[len(array)/2:]
lc = count(l)
rc = count(r)
s = countsplit(l,r)
return s+lc+rc
s = raw_input()
a = [int(x) for x in s.split(' ')]
print count(a)
依然有些不懂的地方,不知道为什么是O(nlogn)而不是O(n(logn)^2)...
主要是其中调用了一次sort.
Update:
之前复杂度没分析对是因为代码写错了....
#!/usr/bin/python
def countsplit(l,r) :
i = 0
j = 0
c = 0
s = []
while i < len(l) and j < len(r) :
if(l[i] <= r[j]) :
s.append(l[i])
i+=1
else :
c+=len(l)-i
s.append(r[j])
j+=1
while i < len(l) :
s.append(l[i])
i+=1
while j < len(r) :
s.append(r[j])
j+=1
return s,c
def count(array) :
if len(array) <= 1 :
return array,0
l = array[0:len(array)/2]
r = array[len(array)/2:]
l,lc = count(l)
r,rc = count(r)
s,sc = countsplit(l,r)
return s,sc+lc+rc
s = raw_input()
a = [int(x) for x in s.split(' ')]
a,ac = count(a)
print ac
不该sort的...应该是来自merge sort.