CSES - Datatähti Open 2021 - Results
Submission details
Task:Sorting
Sender:ziihrs
Submission time:2021-01-31 17:55:45 +0200
Language:Python3 (PyPy3)
Status:READY
Result:100
Feedback
groupverdictscore
#1ACCEPTED36
#2ACCEPTED64
Test results
testverdicttimegroup
#1ACCEPTED0.13 s1, 2details
#2ACCEPTED0.23 s2details
#3ACCEPTED0.19 s1, 2details
#4ACCEPTED0.22 s1, 2details

Code

from random import shuffle
from heapq import heappush, heappop
import sys

def brute(A):
	prev = {tuple(A): None}
	Q = [(0, tuple(A))]
	while Q:
		d, state = heappop(Q)
		lstate = list(state)
		if lstate == sorted(lstate):
			path = [state]
			while prev[path[-1]] is not None:
				path.append(prev[path[-1]])

			path.reverse()
			"""
			for s in path:
				print(s, file=sys.stderr)
			"""

			return 'YES', path

		for i in range(N):
			for j in range(i+2, N-1):
				B = list(lstate)
				B[i], B[i+1], B[j], B[j+1] = B[j], B[j+1], B[i], B[i+1]
				tB = tuple(B)
				if tB not in prev:
					prev[tB] = state
					heappush(Q, (d, tB))
	else:
		from itertools import permutations
		#for perm in permutations(range(len(A))):
		#	if not perm in prev:
		#		print(perm)
		return 'NO', []


def swap(A, i, j):
	A[i], A[i+1], A[j], A[j+1] = A[j], A[j+1], A[i], A[i+1]

def g(A):
	N = len(A)
	tree = [0] * N
	def update(pos, v):
		while pos < N:
			tree[pos] += v
			pos |= pos + 1

	def query(pos):
		res = 0
		while pos > 0:
			res += tree[pos-1]
			pos &= pos-1
		return res

	invs = 0
	for i, v in enumerate(A):
		invs += i - query(v)
		update(v, 1)

	return 'YES' if invs % 2 == 0 else 'NO'


def f(A):
	for i in range(N):
		if A[i] == i: continue
		j = A.index(i)
		if j == N-1:
			if N - i <= 4:
				return 'NO', A

			swap(A, N-4, N-2)
			swap(A, i, N-3)

		elif j == i+1:
			if N - i <= 4:
				return 'NO', A

			swap(A, i+1, i+3)
			swap(A, i, i+3)
		else:
			swap(A, i, j)
	else:
		return 'YES', None


"""
N = 8
for _ in range(1000):
	A = list(range(N))
	shuffle(A)
	a1, path = brute(A)
	#break
	a2 = g(list(A))
	#a2, fail = f(list(A))

	if a1 == 'NO':
		print(a1, A)

	if a1 != a2:
		print(a1, a2, A)
		print(*path, sep='\n')
		break

raise SystemExit
"""


for _ in range(int(input())):
	N = int(input())
	A = list(map(lambda s: int(s)-1, input().split()))

	if N <= 4:
		a, _ = brute(A)
	else:
		a = g(A)

	print(a)

Test details

Test 1

Group: 1, 2

Verdict: ACCEPTED

input
153
1
1
2
1 2
...

correct output
YES
YES
NO
NO
NO
...

user output
YES
YES
NO
NO
NO
...
Truncated

Test 2

Group: 2

Verdict: ACCEPTED

input
1000
59
35 29 32 50 11 15 9 21 19 45 2...

correct output
YES
NO
YES
NO
YES
...

user output
YES
NO
YES
NO
YES
...
Truncated

Test 3

Group: 1, 2

Verdict: ACCEPTED

input
720
6
1 6 4 5 2 3
6
6 3 2 1 5 4
...

correct output
YES
NO
NO
NO
YES
...

user output
YES
NO
NO
NO
YES
...
Truncated

Test 4

Group: 1, 2

Verdict: ACCEPTED

input
1000
8
7 4 2 8 6 3 5 1
8
3 8 2 7 5 4 6 1
...

correct output
NO
NO
YES
NO
YES
...

user output
NO
NO
YES
NO
YES
...
Truncated