← Home
For problem statement at 1000-1999/1600-1699/1610-1619/1617/problemD2.txt this is a correct solution, but verifier at 1000-1999/1600-1699/1610-1619/1617/verifierD2.go ends with Problem D2 is interactive and cannot be automatically verified. can you fix the verifier? package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var t int
	fmt.Fscan(reader, &t)

	for tc := 0; tc < t; tc++ {
		var n int
		fmt.Fscan(reader, &n)

		ask := func(x, y, z int) int {
			fmt.Fprintf(writer, "? %d %d %d\n", x, y, z)
			writer.Flush()
			var res int
			fmt.Fscan(reader, &res)
			return res
		}

		ans := make([]int, n/3+1)
		groupA := -1
		groupB := -1
		for i := 1; i <= n/3; i++ {
			ans[i] = ask(3*i-2, 3*i-1, 3*i)
			if ans[i] == 0 {
				groupA = i
			} else {
				groupB = i
			}
		}

		a1, a2, a3 := 3*groupA-2, 3*groupA-1, 3*groupA
		b1, b2, b3 := 3*groupB-2, 3*groupB-1, 3*groupB

		w1 := ask(a2, a3, b1)
		var I, C int
		if w1 == 1 {
			I, C = a1, b1
		} else {
			w2 := ask(a3, b1, b2)
			if w2 == 1 {
				I, C = a2, b2
			} else {
				I, C = a3, b3
			}
		}

		isImpostor := make([]bool, n+1)
		isImpostor[I] = true
		isImpostor[C] = false

		for _, p := range []int{a1, a2, a3, b1, b2, b3} {
			if p != I && p != C {
				res := ask(I, C, p)
				if res == 0 {
					isImpostor[p] = true
				} else {
					isImpostor[p] = false
				}
			}
		}

		for i := 1; i <= n/3; i++ {
			if i == groupA || i == groupB {
				continue
			}
			x, y, z := 3*i-2, 3*i-1, 3*i
			if ans[i] == 0 {
				res := ask(C, x, y)
				if res == 0 {
					isImpostor[x] = true
					isImpostor[y] = true
					resZ := ask(I, C, z)
					isImpostor[z] = (resZ == 0)
				} else {
					isImpostor[z] = true
					resX := ask(I, C, x)
					if resX == 0 {
						isImpostor[x] = true
						isImpostor[y] = false
					} else {
						isImpostor[x] = false
						isImpostor[y] = true
					}
				}
			} else {
				res := ask(I, x, y)
				if res == 1 {
					isImpostor[x] = false
					isImpostor[y] = false
					resZ := ask(I, C, z)
					isImpostor[z] = (resZ == 0)
				} else {
					isImpostor[z] = false
					resX := ask(I, C, x)
					if resX == 0 {
						isImpostor[x] = true
						isImpostor[y] = false
					} else {
						isImpostor[x] = false
						isImpostor[y] = true
					}
				}
			}
		}

		var impostors []int
		for i := 1; i <= n; i++ {
			if isImpostor[i] {
				impostors = append(impostors, i)
			}
		}

		fmt.Fprintf(writer, "! %d", len(impostors))
		for _, p := range impostors {
			fmt.Fprintf(writer, " %d", p)
		}
		fmt.Fprintln(writer)
		writer.Flush()
	}
}