結果
| 問題 |
No.1767 BLUE to RED
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-06-18 12:45:03 |
| 言語 | Go (1.23.4) |
| 結果 |
AC
|
| 実行時間 | 144 ms / 2,000 ms |
| コード長 | 2,291 bytes |
| コンパイル時間 | 15,154 ms |
| コンパイル使用メモリ | 223,540 KB |
| 実行使用メモリ | 22,092 KB |
| 最終ジャッジ日時 | 2024-10-10 01:14:13 |
| 合計ジャッジ時間 | 18,876 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 21 |
ソースコード
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
)
var sc = bufio.NewScanner(os.Stdin)
var out = bufio.NewWriter(os.Stdout)
func solve(n, m int, a, b []int) int {
ca := make([]int, n)
copy(ca, a)
mn, mx := 0, int(1e9)+1
ca = append([]int{mn}, ca...)
ca = append(ca, mx)
type section struct {
l, r int
}
c := make(map[section][]int)
for j := 0; j < m; j++ {
idx := sort.Search(len(ca), func(i int) bool {
return b[j] <= ca[i]
})
l, r := ca[idx-1], ca[idx]
c[section{l, r}] = append(c[section{l, r}], b[j])
}
var ans int
for k, v := range c {
for len(v) > 0 {
if k.l == mn {
ans += k.r - v[len(v)-1]
k.r = v[len(v)-1]
v = v[:len(v)-1]
} else if k.r == mx {
ans += v[0] - k.l
k.l = v[0]
v = v[1:]
} else {
dl, dr := v[0]-k.l, k.r-v[len(v)-1]
if dl <= dr {
ans += v[0] - k.l
k.l = v[0]
v = v[1:]
} else {
ans += k.r - v[len(v)-1]
k.r = v[len(v)-1]
v = v[:len(v)-1]
}
//38 55 64 68 70 92 97
// 38:1, 97:2, 92:5, 55:17, 64:9, 68:4, 70:2
//
}
}
}
return ans
}
func main() {
buf := make([]byte, 1024*1024)
sc.Buffer(buf, bufio.MaxScanTokenSize)
sc.Split(bufio.ScanWords)
n, m := nextInt(), nextInt()
a := nextIntSlice(n)
b := nextIntSlice(m)
ans := solve(n, m, a, b)
PrintInt(ans)
}
func nextInt() int {
sc.Scan()
i, _ := strconv.Atoi(sc.Text())
return i
}
func nextIntSlice(n int) []int {
s := make([]int, n)
for i := range s {
s[i] = nextInt()
}
return s
}
func PrintInt(x int) {
defer out.Flush()
fmt.Fprintln(out, x)
}
func PrintFloat64(x float64) {
defer out.Flush()
fmt.Fprintln(out, x)
}
func PrintString(x string) {
defer out.Flush()
fmt.Fprintln(out, x)
}
func PrintHorizonaly(x []int) {
defer out.Flush()
fmt.Fprintf(out, "%d", x[0])
for i := 1; i < len(x); i++ {
fmt.Fprintf(out, " %d", x[i])
}
fmt.Fprintln(out)
}
func PrintVertically(x []int) {
defer out.Flush()
for _, v := range x {
fmt.Fprintln(out, v)
}
}
func Abs(x int) int {
if x < 0 {
return -x
}
return x
}
func Min(x, y int) int {
if x < y {
return x
}
return y
}
func Max(x, y int) int {
if x < y {
return y
}
return x
}
func Floor(x, y int) int {
return x / y
}
func Ceil(x, y int) int {
return (x + y - 1) / y
}