まず、データ範囲、Oである問題(N 2)
貪欲考えてみましょう
あなたは二次元の範囲の問題にそれらを置くことができるので、それはそれぞれの線分が計画を計算し、ポイントを持っているように、セグメントのポイントが選択されている、行と列は関係ありません検索。
インパクトに背中を考慮しないようにしてください、それが私たちの橋を燃やしているので、右のポイントを注文するに従い、可能な限り前にフロントには、別途に対処しました。
最後に、元の数の出力を覚えています。
#include <ビット/ STDC ++ H.> 使用して 名前空間STD; INT N-; BOOL B1 [ 5005 ]、B2 [ 5005 ]; 構造体ノード{ int型の X1、X2、Y1、Y2、X、Y、IND;} A [ 5005 ] ; BOOL CMP(ノードA、ノードB){ 戻り a.x2 <b.x2;} // 最初のソート BOOL CMP1(ノードA、ノードB){ 戻り a.y2 <b.y2;} // の二次 BOOL CMP2(ノードA、ノードB)は、{ 戻る b.ind <a.ind;} // 第 BOOL CCF(){ // エヘンは (B1、B1 + N- +塗りつぶし1。、0); B2、B2 + N - +(塗りつぶし1。 、0); // クリア使用アレイ のための(INT I = 1 ; I <= N; I ++ ){ scanfの(" %D%D%D%D "、 A&[I] .x1、&A [I] .y1、&A [I] .x2、&A [I] .Y2); // 入力 A [I] .IND = I;レコード番号 } ソート(A + 1、 + + N-A 1、CMP); // プロセス横軸 用(INT I = 1 I <= N; I ++ ){ int型 J = A [I] .x1; のため(; J <= A [I] .x2 ; ++ J)// 検索前後 IF {B1 [J] =(!B1 [J])。1 ;、A [I] .X = J BREAK ;} IF(J> A [I] .x2)リターン falseにし ; // もしノーリターン } ソート(A + 1、+ N-A + 1、CMP1); // プロセス縦軸 ため(INT I = 1 ; I <= N; I ++は){ int型 J = A [I] .y1 ; のための(; J <= A [I] .Y2; ++ J) IF {B2 [J] =(!B2 [J])。1、A [I] .Y = J; BREAK ;} IF(J> [I] .y2)返す 偽; } ソート(A + 1、A + N + 1、CMP2)。// 按照原序号输出 ため(int型 I = 1 ; I <= N; iは++ ) のprintf(" %D%D \ n " 、[I] .X、[I] .Y)。 返す 真; } int型のmain(){ ながら(〜のscanf(" %d個"、&N)&& n)の 場合プット((CCF()!)" IMPOSSIBLE " )。 }