← Home
For problem statement at 1000-1999/1100-1199/1100-1109/1107/problemG.txt this is a correct solution, but verifier at 1000-1999/1100-1199/1100-1109/1107/verifierG.go ends with All tests passed can you fix the verifier? package main

import (
	"fmt"
	"io"
	"os"
	"sort"
)

type Edge struct {
	w   int64
	idx int
}

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

func main() {
	data, _ := io.ReadAll(os.Stdin)
	pos := 0
	nextInt := func() int64 {
		for pos < len(data) && (data[pos] < '0' || data[pos] > '9') && data[pos] != '-' {
			pos++
		}
		sign := int64(1)
		if data[pos] == '-' {
			sign = -1
			pos++
		}
		var v int64
		for pos < len(data) && data[pos] >= '0' && data[pos] <= '9' {
			v = v*10 + int64(data[pos]-'0')
			pos++
		}
		return v * sign
	}

	n := int(nextInt())
	a := nextInt()

	edges := make([]Edge, max(0, n-1))
	weight := make([]int64, n)

	var prevD int64
	for i := 0; i < n; i++ {
		d := nextInt()
		c := nextInt()
		weight[i] = a - c
		if i > 0 {
			diff := d - prevD
			edges[i-1] = Edge{w: diff * diff, idx: i - 1}
		}
		prevD = d
	}

	sort.Slice(edges, func(i, j int) bool {
		if edges[i].w == edges[j].w {
			return edges[i].idx < edges[j].idx
		}
		return edges[i].w < edges[j].w
	})

	parent := make([]int, n)
	size := make([]int, n)
	left := make([]int, n)
	sum := make([]int64, n)
	pref := make([]int64, n)
	suf := make([]int64, n)
	best := make([]int64, n)

	ans := weight[0]
	for i := 0; i < n; i++ {
		parent[i] = i
		size[i] = 1
		left[i] = i
		sum[i] = weight[i]
		pref[i] = weight[i]
		suf[i] = weight[i]
		best[i] = weight[i]
		if weight[i] > ans {
			ans = weight[i]
		}
	}

	for _, e := range edges {
		rx := find(parent, e.idx)
		ry := find(parent, e.idx+1)

		lr, rr := rx, ry
		if left[lr] > left[rr] {
			lr, rr = rr, lr
		}

		mergedSum := sum[lr] + sum[rr]

		mergedPref := pref[lr]
		if sum[lr]+pref[rr] > mergedPref {
			mergedPref = sum[lr] + pref[rr]
		}

		mergedSuf := suf[rr]
		if sum[rr]+suf[lr] > mergedSuf {
			mergedSuf = sum[rr] + suf[lr]
		}

		mergedBest := best[lr]
		if best[rr] > mergedBest {
			mergedBest = best[rr]
		}
		if suf[lr]+pref[rr] > mergedBest {
			mergedBest = suf[lr] + pref[rr]
		}

		root, other := rx, ry
		if size[root] < size[other] {
			root, other = other, root
		}
		parent[other] = root
		size[root] += size[other]
		if left[other] < left[root] {
			left[root] = left[other]
		}
		sum[root] = mergedSum
		pref[root] = mergedPref
		suf[root] = mergedSuf
		best[root] = mergedBest

		cand := mergedBest - e.w
		if cand > ans {
			ans = cand
		}
	}

	fmt.Print(ans)
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}