技巧
滑动窗口(双端单调队列)
思路
这个问题一上来其实就知道是滑动窗口
奈何coding能力太差搞了半天。。。
其实需要注意的是要时刻保持单调性 后面进来的如果优于之前的。 那么之前的全都得淘汰(可以想象成年前而且能力强的)
再者需要注意如何找到淘汰的元素
属于一个coding题。。。
实现
package main
import (
"bufio"
. "fmt"
"io"
"os"
)
// https://ac.nowcoder.com/acm/problem/50528
func NC50528(_r io.Reader, _w io.Writer) {
in, out := bufio.NewReader(_r), bufio.NewWriter(_w)
defer out.Flush()
var N, K int
Fscan(in, &N, &K)
a := make([]int, N)
for i := 0; i < N; i++ {
Fscan(in, &a[i])
}
// ------------------------------------------------------
tmp := make([]int, N)
l, r := 0, 0
for i := 0; i < N; i++ {
for r > l && a[i] <= a[tmp[r-1]] {
r--
}
tmp[r] = i; r++
if i - tmp[l] >= K{
l++
}
if i >= K-1 {
if i == K-1 {
Fprint(out, a[tmp[l]])
}else {
Fprint(out, " ", a[tmp[l]])
}
}
}
Fprintln(out)
l, r = 0, 0
for i := 0; i < N; i++ {
for r > l && a[i] >= a[tmp[r-1]] {
r--
}
tmp[r] = i; r++
if i - tmp[l] >= K{
l++
}
if i >= K-1 {
if i == K-1 {
Fprint(out, a[tmp[l]])
}else {
Fprint(out, " ", a[tmp[l]])
}
}
}
// ------------------------------------------------------
}
func main() {
NC50528(os.Stdin, os.Stdout)
}

京公网安备 11010502036488号