← Home
For problem statement at 1000-1999/1700-1799/1770-1779/1773/problemA.txt this is a correct solution, but verifier at 1000-1999/1700-1799/1770-1779/1773/verifierA.go ends with test 1 case 4: candidate claims Possible but reference Impossible
input case:
n = 5
a = 5 1 4 2 3
exit status 1 can you fix the verifier? package main

import (
	"bufio"
	"io"
	"os"
	"strconv"
)

type FastScanner struct {
	data []byte
	idx  int
}

func (fs *FastScanner) NextInt() int {
	for fs.idx < len(fs.data) && (fs.data[fs.idx] < '0' || fs.data[fs.idx] > '9') {
		fs.idx++
	}
	val := 0
	for fs.idx < len(fs.data) && fs.data[fs.idx] >= '0' && fs.data[fs.idx] <= '9' {
		val = val*10 + int(fs.data[fs.idx]-'0')
		fs.idx++
	}
	return val
}

func writePerm(w *bufio.Writer, p []int, n int) {
	for i := 1; i <= n; i++ {
		if i > 1 {
			w.WriteByte(' ')
		}
		w.WriteString(strconv.Itoa(p[i]))
	}
	w.WriteByte('\n')
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	fs := FastScanner{data: data}
	t := fs.NextInt()

	w := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer w.Flush()

	for ; t > 0; t-- {
		n := fs.NextInt()
		sigma := make([]int, n+1)
		for pos := 1; pos <= n; pos++ {
			x := fs.NextInt()
			sigma[x] = pos
		}

		if n == 1 {
			w.WriteString("Impossible\n")
			continue
		}

		if n == 2 {
			if sigma[1] == 1 && sigma[2] == 2 {
				w.WriteString("Possible\n")
				w.WriteString("2 1\n")
				w.WriteString("2 1\n")
			} else {
				w.WriteString("Impossible\n")
			}
			continue
		}

		visited := make([]bool, n+1)
		order := make([]int, 0, n)
		forbidden := make([]bool, n+1)

		for i := 1; i <= n; i++ {
			if visited[i] {
				continue
			}
			cur := i
			length := 0
			for !visited[cur] {
				visited[cur] = true
				order = append(order, cur)
				length++
				cur = sigma[cur]
			}
			if length >= 2 && length <= n-1 {
				forbidden[n-length+1] = true
			}
		}

		k := 0
		for s := 2; s <= n-1; s++ {
			if !forbidden[s] {
				k = s
				break
			}
		}

		if k == 0 {
			w.WriteString("Impossible\n")
			continue
		}

		q := make([]int, n+1)
		for idx, x := range order {
			q[x] = order[(idx+k)%n]
		}

		p := make([]int, n+1)
		for i := 1; i <= n; i++ {
			p[q[i]] = sigma[i]
		}

		w.WriteString("Possible\n")
		writePerm(w, p, n)
		writePerm(w, q, n)
	}
}