← Home
For problem statement at 1000-1999/1700-1799/1760-1769/1767/problemE.txt this is a correct solution, but verifier at 1000-1999/1700-1799/1760-1769/1767/verifierE.go ends with All tests passed can you fix the verifier? ```go
package main

import (
	"bufio"
	"io"
	"math/bits"
	"os"
	"strconv"
)

func mwis(weights []int64, adj []uint64) int64 {
	k := len(weights)
	if k == 0 {
		return 0
	}

	k1 := k / 2
	k2 := k - k1

	var leftLimit uint64
	if k1 > 0 {
		leftLimit = (uint64(1) << uint(k1)) - 1
	}
	var rightLimit uint64
	if k2 > 0 {
		rightLimit = (uint64(1) << uint(k2)) - 1
	}

	adjLL := make([]int, k1)
	adjLR := make([]uint32, k1)
	for i := 0; i < k1; i++ {
		adjLL[i] = int(adj[i] & leftLimit)
		if k2 > 0 {
			adjLR[i] = uint32((adj[i] >> uint(k1)) & rightLimit)
		}
	}

	adjRR := make([]int, k2)
	for j := 0; j < k2; j++ {
		idx := k1 + j
		if k2 > 0 {
			adjRR[j] = int((adj[idx] >> uint(k1)) & rightLimit)
		}
	}

	rightSize := 1 << uint(k2)
	dp := make([]int64, rightSize)
	for i := 1; i < rightSize; i++ {
		dp[i] = -1
	}
	for mask := 1; mask < rightSize; mask++ {
		lb := mask & -mask
		v := bits.TrailingZeros(uint(lb))
		pm := mask ^ lb
		if dp[pm] >= 0 && (adjRR[v]&pm) == 0 {
			dp[mask] = dp[pm] + weights[k1+v]
		} else {
			dp[mask] = -1
		}
	}

	for i := 0; i < k2; i++ {
		bit := 1 << uint(i)
		for mask := 0; mask < rightSize; mask++ {
			if mask&bit != 0 && dp[mask^bit] > dp[mask] {
				dp[mask] = dp[mask^bit]
			}
		}
	}

	ans := dp[rightSize-1]

	leftSize := 1 << uint(k1)
	leftW := make([]int64, leftSize)
	leftAllow := make([]uint32, leftSize)
	for i := 1; i < leftSize; i++ {
		leftW[i] = -1
	}
	var allR uint32
	if k2 > 0 {
		allR = uint32(rightSize - 1)
	}
	leftAllow[0] = allR

	for mask := 1; mask < leftSize; mask++ {
		lb := mask & -mask
		v := bits.TrailingZeros(uint(lb))
		pm := mask ^ lb
		if leftW[pm] >= 0 && (adjLL[v]&pm) == 0 {
			leftW[mask] = leftW[pm] + weights[v]
			leftAllow[mask] = leftAllow[pm] &^ adjLR[v]
			cand := leftW[mask] + dp[int(leftAllow[mask])]
			if cand > ans {
				ans = cand
			}
		} else {
			leftW[mask] = -1
		}
	}

	return ans
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	nextInt := func() int {
		for idx < len(data) && (data[idx] < '0' || data[idx] > '9') {
			idx++
		}
		val := 0
		for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
			val = val*10 + int(data[idx]-'0')
			idx++
		}
		return val
	}

	n := nextInt()
	m := nextInt()

	forced := make([]bool, m)
	adjOrig := make([]uint64, m)

	first := nextInt() - 1
	prev := first
	for i := 1; i < n; i++ {
		cur := nextInt() - 1
		if prev == cur {
			forced[prev] = true
		} else {
			adjOrig[prev] |= uint64(1) << uint(cur)
			adjOrig[cur] |= uint64(1) << uint(prev)
		}
		prev = cur
	}
	last := prev

	forced[first] = true
	forced[last] = true

	cost := make([]int64, m)
	for i := 0; i < m; i++ {
		cost[i] = int64(nextInt())
	}

	mapNew := make([]int, m)
	for i := 0; i < m; i++ {
		mapNew[i] = -1
	}

	var forcedCost int64
	var totalRem int64
	weights := make([]int64, 0, m)
	for i := 0; i < m; i++ {
		if forced[i] {
			forcedCost += cost[i]
		} else {
			mapNew[i] = len(weights)
			weights = append(weights, cost[i])
			totalRem += cost[i]
		}
	}

	adjNew := make([]uint64, len(weights))
	for i := 0; i < m; i++ {
		ni := mapNew[i]
		if ni == -1 {
			continue
		}
		var mask uint64
		for j := 0; j < m; j++ {
			if adjOrig[i]&(uint64(1)<<uint(j)) != 0 {
				nj := mapNew[j]
				if nj != -1 {
					mask |= uint64(1) << uint(nj)
				}
			}
		}
		adjNew[ni] = mask
	}

	maxIS := mwis(weights, adjNew)
	ans := forcedCost + totalRem - maxIS

	out := bufio.NewWriter(os.Stdout)
	out.WriteString(strconv.FormatInt(ans, 10))
	out.WriteByte('\n')
	out.Flush()
}
```