ZOJ Problem Set - 1201 Inversion (Python)

ZOJ Problem Set - 1201
Inversion

Time Limit: 1 Second      Memory Limit: 32768 KB

  Let { A1,A2,...,An } be a permutation of the set{ 1,2,..., n}. If i < j and Ai > Aj then the pair (Ai,Aj) is called an "inversion" of the permutation. For example, the permutation {3, 1, 4, 2} has three inversions: (3,1), (3,2) and (4,2).
  The inversion table B1,B2,...,Bn of the permutation { A1,A2,...,An } is obtained by letting Bj be the number of elements to the left of j that are greater than j. (In other words, Bj is the number of inversions whose second component is j.) For example, the permutation:
{ 5,9,1,8,2,6,4,7,3 }
has the inversion table
2 3 6 4 0 2 2 1 0
since there are 2 numbers, 5 and 9, to the left of 1; 3 numbers, 5, 9 and 8, to the left of 2; etc.
  Perhaps the most important fact about inversions is Marshall Hall's observation that an inversion table uniquely determines the corresponding permutation. So your task is to convert a permutation to its inversion table, or vise versa, to convert from an inversion table to the corresponding permutation.

Input:
The input consists of several test cases. Each test case contains two lines.
The first line contains a single integer N ( 1 <= N <= 50) which indicates the number of elements in the permutation/invertion table.
The second line begins with a single charactor either 'P', meaning that the next N integers form a permutation, or 'I', meaning that the next N integers form an inversion table.
Following are N integers, separated by spaces. The input is terminated by a line contains N=0.

Output:
For each case of the input output a line of intergers, seperated by a single space (no space at the end of the line). If the input is a permutation, your output will be the corresponding inversion table; if the input is an inversion table, your output will be the corresponding permutation.

Sample Input:
9
P 5 9 1 8 2 6 4 7 3
9
I 2 3 6 4 0 2 2 1 0
0

Sample Output:
2 3 6 4 0 2 2 1 0
5 9 1 8 2 6 4 7 3

Source: Zhejiang University Local Contest 2002, Preliminary

import sys

def readArraySize():
line
= sys.stdin.readline()
a
= line.split()
n
= int(a[0])
return n
def main():
n
= readArraySize()
while (n) != 0:
line
= sys.stdin.readline()
a
= line.split()
m
= a.pop(0)
if m == 'P':
P2I(a, n)
else:
I2P(a, n)
n
= readArraySize()
return 0

def P2I(b, n):
result
= [0] * n
for i in range(n):
for j in range(i):
if b[j] > b[i]:
result[int(b[i])
- 1] = result[int(b[i]) - 1] + 1
print result

def I2P(b, n):
result
= [n + 1] * n
for i in range(n):
j
= 0
while result[j] < i + 1:
j
= j + 1
for k in range(int(b[i])): #find a place for i+1
j = j + 1
while result[j] < i + 1:
j
= j + 1
result[j]
= i + 1
print result

if __name__ == '__main__':
main()

最近对AC有困扰啊。。。测试通过,无法AC,无法找出bug,请高手斧正!

posted on 2011-02-17 13:56  天下之大  阅读(445)  评论(0编辑  收藏  举报

导航