package main import . "fmt" func main() { var n, s int Scan(&n, &s) xs := make([]int, n) ws := make([]int, n) fp := 0 // スタート地点の右隣の地点index for i := range xs { Scan(&xs[i]) if s > xs[i] { fp = i+1 } } total := 0 for i := range ws { Scan(&ws[i]) total += ws[i] } const XXX = 1 << 60 cs := make([]int, n) ts := make([]int, n) for i := range cs { cs[i] = XXX } if fp-1 >= 0 { cs[fp-1] = (s - xs[fp-1]) * total ts[fp-1] = total - ws[fp-1] } if fp < n { cs[fp] = (xs[fp] - s) * total ts[fp] = total - ws[fp] } nxcs := make([]int, n) nxts := make([]int, n) for k := 1; k < n; k++ { for i := range nxcs { nxcs[i] = XXX nxts[i] = 0 } for i, c := range cs { if c == XXX { continue } if i < fp { if i-1 >= 0 { cost := (xs[i]-xs[i-1])*ts[i] nxcs[i-1] = min(nxcs[i-1], c+cost) nxts[i-1] = ts[i]-ws[i-1] } if j := i+k; j < n { cost := (xs[j]-xs[i])*ts[i] nxcs[j] = min(nxcs[j], c+cost) nxts[j] = ts[i]-ws[j] } } else { if i+1 < n { cost := (xs[i+1]-xs[i])*ts[i] nxcs[i+1] = min(nxcs[i+1], c+cost) nxts[i+1] = ts[i]-ws[i+1] } if j := i-k; j >= 0 { cost := (xs[i]-xs[j])*ts[i] nxcs[j] = min(nxcs[j], c+cost) nxts[j] = ts[i]-ws[j] } } } cs,nxcs = nxcs,cs ts,nxts = nxts,ts } Println(min(cs[0], cs[n-1])) }