日常の問題に(コピー)ソリューションを参照するには、レコードの日。
https://www.luogu.org/problem/P2698
我々は増加し、行番号順の順序に従ってX座標ができるので、我々は、縦軸を残し、
横座標(L、R)間隔、最大値 - 最小値、縦軸はDより大きい場合、答えを更新することができます。
見成長Lとして、Rがインクリメントされなければなりません。
それは存在しない(L2、R2)、L2> L1とR2 <R、(MAXY-MINY)> Dを証明することができる、と回答に影響を与えることができます。
これが存在する場合、R 2 lが最初に一致したオブジェクトでなければならないので、答えは優れています。
これは、スライディングウィンドウ法を含みます。
座標最大垂直の記録位置、Q2 []最小垂直の記録位置座標[]とQL。
R&LTのLの範囲内;
キュー間隔の範囲を更新します。
一方、(H1 <= T1 && Q1 [H1] <L)H1 ++ 。
一方、(H2 <= T2 && Q2 [H 2] <L)H2 ++。
R、最大値、最小値を更新します。
一方、(。。[Q1 [H1] YA [Q2 [H 2] Y <D && R < N) { ++ R。 一方、([Q1 [T1] Y <[R] .Y && H1 <= T1。)t1-- 。 Q1 [ ++ T1] = R。 一方、([Q2 [T2] Y> [R] .Y && H2 <= T2)t2-- 。 Q2 [ ++ T2] = R。 }
書式#include <cstdioを> する#include <CStringの> の#include <アルゴリズム> 使用して 名前空間はstdを、 const int型 MAXN = 1E6 + 10 。 INT Q1 [MAXN]、Q2 [MAXN]、H1 = 1、H2 = 1 、T1、T2。 int型nは、D; 構造体ノード { int型X、Y。 } [MAXN]。 BOOL CMP(ノードQW、ノードWE) { 戻り <qw.x we.x。 } INT ANS = 2147483647 。 INT メイン() { scanf関数(" %D%dの"、&N、&D)。 以下のために(int型 i = 1 ; iが<= N; iは++ ) { scanf関数(" %d個の%のD "、および[I] .X、&[I] .Y)。 } ソート(A + 1、A + N + 1 、CMP)。 用(int型、L = 1、R = 0 ; L <= N L ++ ) { 一方(H1 <= T1 && Q1 [H1] <L)H1 ++ 。 一方、(H2 <= T2 && Q2 [H 2] <L)H2 ++ 。 一方、([Q1 [H1]。YA [Q2 [H2]。Y <D && R < R; 一方、([Q1 [T1] Y <[R] .Y && H1 <= T1。)t1-- 。 Q1 [ ++ T1] = R。 一方、([Q2 [T2] Y> [R] .Y && H2 <= T2)t2-- 。 Q2 [ ++ T2] = R。 } であれば(。。[Q1 [H1] YA [Q2 [H 2] Y> = D)ANS =分(ANS、[R]は.x- [L] .X)。 } 場合(ANS == 2147483647)のprintf(" -1 " )。 他のprintf(" %d個" 、ANS)。 リターン 0 ; }