技巧
滑动窗口(双端单调队列)
思路
这个问题一上来其实就知道是滑动窗口
奈何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) }