#!python
n = int(input())
t = []
for i in range(n):
t.append(int(input()))
tt=sorted(t)
m = {x: i for i, x in enumerate(tt)}
t = [m[x] for x in t]
#print([x+1 for x in t])
cycles = []
used = set()
for i in range(n):
c = []
curr = t[i]
while curr not in used:
c.append(curr)
used.add(curr)
curr = t[curr]
if len(c) > 0:
cycles.append(c)
cycles = [[x+1 for x in c] for c in cycles]
max_len = max([len(c) for c in cycles])
#print(cycles)
def solve2(cycles):
#print(cycles)
pref = []
suf = []
for c in cycles:
if len(c) == 2:
pref.append(c[0])
suf.append(c[1])
out = pref + suf[::-1]
print(len(out))
print(" ".join([str(i) for i in out]))
def solve_single_cycle(cycle):
#print("solve_single", cycle)
l = len(cycle)
if l < 2:
return [], []
elif l == 2:
return [cycle], []
m = {}
m_rev = {}
for i, x in enumerate(cycle):
to = cycle[(i+1) % len(cycle)]
m[x] = to
m_rev[to] = x
#print(m)
#print(m_rev)
first = []
second = []
a, b, c = cycle[0], cycle[1], cycle[2]
while len(set([a,b,c])) >= 3:
first.append([a, c])
second.append([b, c])
a, b, c = m_rev[a], a, m[c]
if b != c:
second.append([b, c])
#print(first)
#print(second)
return first, second
if max_len == 1:
print(0)
elif max_len == 2:
print(1)
solve2(cycles)
else:
print(2)
c1 = []
c2 = []
for c in cycles:
pairs_1, pairs_2 = solve_single_cycle(c)
c1.extend(pairs_1)
c2.extend(pairs_2)
solve2(c1)
solve2(c2)
"""
tx = [x for x in t]
used = set()
for c in c1:
assert c[0] not in used
assert c[1] not in used
used.add(c[0])
used.add(c[1])
tx[c[0]-1], tx[c[1]-1] = tx[c[1]-1], tx[c[0]-1]
used = set()
for c in c2:
assert c[0] not in used
assert c[1] not in used
used.add(c[0])
used.add(c[1])
tx[c[0]-1], tx[c[1]-1] = tx[c[1]-1], tx[c[0]-1]
#print(tx)
assert tx == list(range(n))
"""
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | #!python n = int(input()) t = [] for i in range(n): t.append(int(input())) tt=sorted(t) m = {x: i for i, x in enumerate(tt)} t = [m[x] for x in t] #print([x+1 for x in t]) cycles = [] used = set() for i in range(n): c = [] curr = t[i] while curr not in used: c.append(curr) used.add(curr) curr = t[curr] if len(c) > 0: cycles.append(c) cycles = [[x+1 for x in c] for c in cycles] max_len = max([len(c) for c in cycles]) #print(cycles) def solve2(cycles): #print(cycles) pref = [] suf = [] for c in cycles: if len(c) == 2: pref.append(c[0]) suf.append(c[1]) out = pref + suf[::-1] print(len(out)) print(" ".join([str(i) for i in out])) def solve_single_cycle(cycle): #print("solve_single", cycle) l = len(cycle) if l < 2: return [], [] elif l == 2: return [cycle], [] m = {} m_rev = {} for i, x in enumerate(cycle): to = cycle[(i+1) % len(cycle)] m[x] = to m_rev[to] = x #print(m) #print(m_rev) first = [] second = [] a, b, c = cycle[0], cycle[1], cycle[2] while len(set([a,b,c])) >= 3: first.append([a, c]) second.append([b, c]) a, b, c = m_rev[a], a, m[c] if b != c: second.append([b, c]) #print(first) #print(second) return first, second if max_len == 1: print(0) elif max_len == 2: print(1) solve2(cycles) else: print(2) c1 = [] c2 = [] for c in cycles: pairs_1, pairs_2 = solve_single_cycle(c) c1.extend(pairs_1) c2.extend(pairs_2) solve2(c1) solve2(c2) """ tx = [x for x in t] used = set() for c in c1: assert c[0] not in used assert c[1] not in used used.add(c[0]) used.add(c[1]) tx[c[0]-1], tx[c[1]-1] = tx[c[1]-1], tx[c[0]-1] used = set() for c in c2: assert c[0] not in used assert c[1] not in used used.add(c[0]) used.add(c[1]) tx[c[0]-1], tx[c[1]-1] = tx[c[1]-1], tx[c[0]-1] #print(tx) assert tx == list(range(n)) """ |
English