UVA11134伝説の車フェイブルドルックス

まず、データ範囲、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 " )。
}

 

おすすめ

転載: www.cnblogs.com/coder-cjh/p/11617059.html