← Home
For problem statement at 0-999/800-899/880-889/883/problemD.txt this is a correct solution, but verifier at 0-999/800-899/880-889/883/verifierD.go ends with test 6 failed
input:41
P.*PP...P*.P**...*PP******PPPP*P..P*P.P..
expected: 13 6
got: 13 3

exit status 1 can you fix the verifier? package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
	"strings"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Buffer(make([]byte, 1024*1024*10), 1024*1024*10)

	if !scanner.Scan() {
		return
	}
	nStr := strings.TrimSpace(scanner.Text())
	n, _ := strconv.Atoi(nStr)

	if !scanner.Scan() {
		return
	}
	field := strings.TrimSpace(scanner.Text())

	var P []int
	var A []int
	for i := 0; i < n; i++ {
		if field[i] == 'P' {
			P = append(P, i)
		} else if field[i] == '*' {
			A = append(A, i)
		}
	}

	k := len(P)
	m := len(A)

	if k == 1 {
		var leftAst, rightAst []int
		for _, a := range A {
			if a <= P[0] {
				leftAst = append(leftAst, a)
			}
			if a >= P[0] {
				rightAst = append(rightAst, a)
			}
		}
		lenL := len(leftAst)
		lenR := len(rightAst)

		maxEaten := 0
		minTime := 0

		if lenL > lenR {
			maxEaten = lenL
			minTime = P[0] - leftAst[0]
		} else if lenR > lenL {
			maxEaten = lenR
			minTime = rightAst[lenR-1] - P[0]
		} else {
			maxEaten = lenL
			t1 := 0
			if lenL > 0 {
				t1 = P[0] - leftAst[0]
			}
			t2 := 0
			if lenR > 0 {
				t2 = rightAst[lenR-1] - P[0]
			}
			if t1 < t2 {
				minTime = t1
			} else {
				minTime = t2
			}
		}
		fmt.Printf("%d %d\n", maxEaten, minTime)
		return
	}

	dp := make([]int, k+1)
	check := func(T int) bool {
		for i := range dp {
			dp[i] = -1
		}
		dp[0] = 0

		for i := 0; i < k; i++ {
			if dp[i] == -1 {
				continue
			}
			j := dp[i]

			if j == m {
				if dp[i+1] < m {
					dp[i+1] = m
				}
				continue
			}

			if dp[i+1] < j {
				dp[i+1] = j
			}

			if P[i] >= A[j] && P[i]-T <= A[j] {
				r := sort.SearchInts(A, P[i]+1)
				if dp[i+1] < r {
					dp[i+1] = r
				}
			}

			if P[i] <= A[j] && P[i]+T >= A[j] {
				r := sort.SearchInts(A, P[i]+T+1)
				if dp[i+1] < r {
					dp[i+1] = r
				}
			}

			if P[i] > A[j] && i+1 < k && P[i+1]-T <= A[j] {
				reach := P[i] + T
				if P[i+1] > reach {
					reach = P[i+1]
				}
				r := sort.SearchInts(A, reach+1)
				if dp[i+2] < r {
					dp[i+2] = r
				}
			}
		}
		return dp[k] == m
	}

	low := 0
	high := n
	ans := n

	for low <= high {
		mid := low + (high - low) / 2
		if check(mid) {
			ans = mid
			high = mid - 1
		} else {
			low = mid + 1
		}
	}

	fmt.Printf("%d %d\n", m, ans)
}