← Home
For problem statement at 1000-1999/1500-1599/1590-1599/1599/problemA.txt this is a correct solution, but verifier at 1000-1999/1500-1599/1590-1599/1599/verifierA.go ends with case 1 failed: expected "-1\n48 L\n10 R\n19 R\n26 L\n38 R" got "32 L\n26 R\n10 L\n19 L\n38 R\n48 L"
input:
6
38 48 10 32 19 26
LLLLRL can you fix the verifier? package main

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

type Move struct {
	w    int64
	side byte
}

func opposite(c byte) byte {
	if c == 'L' {
		return 'R'
	}
	return 'L'
}

func validate(moves []Move, s []byte) bool {
	if len(moves) != len(s) {
		return false
	}
	var d int64
	for i, mv := range moves {
		if mv.side == 'L' {
			d += mv.w
		} else {
			d -= mv.w
		}
		if d == 0 {
			return false
		}
		if d > 0 {
			if s[i] != 'L' {
				return false
			}
		} else {
			if s[i] != 'R' {
				return false
			}
		}
	}
	return true
}

func find(parent []int, x int) int {
	y := x
	for parent[y] != y {
		y = parent[y]
	}
	for parent[x] != x {
		nx := parent[x]
		parent[x] = y
		x = nx
	}
	return y
}

func attempt(arr []int64, runSigns []byte, runLens []int, s []byte, fillerMode int, adaptive bool) ([]Move, bool) {
	n := len(arr)
	k := len(runSigns)
	m := n - k
	fillers := arr[:m]
	anchors := arr[m:]

	moves := make([]Move, 0, n)

	l, r := 0, m-1
	globalHigh := true
	if fillerMode == 3 {
		globalHigh = false
	}

	var parent []int
	if adaptive {
		parent = make([]int, k+1)
		for i := 0; i <= k; i++ {
			parent[i] = i
		}
	}

	var diff int64

	for j := 0; j < k; j++ {
		var a int64
		if adaptive {
			pos := sort.Search(len(anchors), func(i int) bool { return anchors[i] > diff })
			pos = find(parent, pos)
			if pos >= len(anchors) {
				return nil, false
			}
			a = anchors[pos]
			parent[pos] = find(parent, pos+1)
		} else {
			a = anchors[j]
			if j > 0 && a <= diff {
				return nil, false
			}
		}

		moves = append(moves, Move{a, runSigns[j]})
		if j == 0 {
			diff = a
		} else {
			diff = a - diff
		}
		if diff <= 0 {
			return nil, false
		}

		cnt := runLens[j] - 1
		for t := 0; t < cnt; t++ {
			if l > r {
				return nil, false
			}
			var x int64
			switch fillerMode {
			case 0:
				if t%2 == 0 {
					x = fillers[r]
					r--
				} else {
					x = fillers[l]
					l++
				}
			case 1:
				if globalHigh {
					x = fillers[r]
					r--
				} else {
					x = fillers[l]
					l++
				}
				globalHigh = !globalHigh
			case 2:
				if t%2 == 0 {
					x = fillers[l]
					l++
				} else {
					x = fillers[r]
					r--
				}
			case 3:
				if globalHigh {
					x = fillers[r]
					r--
				} else {
					x = fillers[l]
					l++
				}
				globalHigh = !globalHigh
			}

			side := runSigns[j]
			if x < diff {
				side = opposite(side)
				diff -= x
			} else {
				diff += x
			}
			if diff <= 0 {
				return nil, false
			}
			moves = append(moves, Move{x, side})
		}
	}

	if l <= r {
		return nil, false
	}
	if !validate(moves, s) {
		return nil, false
	}
	return moves, true
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	p := 0
	readInt := func() int {
		for p < len(data) && (data[p] == ' ' || data[p] == '\n' || data[p] == '\r' || data[p] == '\t') {
			p++
		}
		sign := 1
		if p < len(data) && data[p] == '-' {
			sign = -1
			p++
		}
		val := 0
		for p < len(data) && data[p] >= '0' && data[p] <= '9' {
			val = val*10 + int(data[p]-'0')
			p++
		}
		return val * sign
	}
	readString := func() []byte {
		for p < len(data) && (data[p] == ' ' || data[p] == '\n' || data[p] == '\r' || data[p] == '\t') {
			p++
		}
		start := p
		for p < len(data) && data[p] != ' ' && data[p] != '\n' && data[p] != '\r' && data[p] != '\t' {
			p++
		}
		return data[start:p]
	}

	n := readInt()
	arr := make([]int64, n)
	for i := 0; i < n; i++ {
		arr[i] = int64(readInt())
	}
	s := append([]byte(nil), readString()...)

	sort.Slice(arr, func(i, j int) bool { return arr[i] < arr[j] })

	runSigns := make([]byte, 0)
	runLens := make([]int, 0)
	for i := 0; i < n; {
		j := i
		for j < n && s[j] == s[i] {
			j++
		}
		runSigns = append(runSigns, s[i])
		runLens = append(runLens, j-i)
		i = j
	}

	type Opt struct {
		fillerMode int
		adaptive   bool
	}

	opts := []Opt{
		{0, true},
		{0, false},
		{1, true},
		{1, false},
		{2, true},
		{2, false},
		{3, true},
		{3, false},
	}

	var ans []Move
	ok := false
	for _, op := range opts {
		if res, good := attempt(arr, runSigns, runLens, s, op.fillerMode, op.adaptive); good {
			ans = res
			ok = true
			break
		}
	}

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

	if !ok {
		w.WriteString("-1\n")
		return
	}

	out := make([]byte, 0, n*20)
	for _, mv := range ans {
		out = strconv.AppendInt(out, mv.w, 10)
		out = append(out, ' ', mv.side, '\n')
	}
	w.Write(out)
}