K - アトランティス(走査線セグメントツリー+)

伝説的な島アトランティスの記述が含まれているいくつかの古代ギリシャ語のテキストがあります。これらのテキストの一部では、島の一部のマップが含まれています。しかし残念ながら、これらのマップは、アトランティスの異なる領域を記述する。あなたの友人ビルはマップが存在するため、総面積を知っている必要があります。あなたは(愚か)この量を計算するプログラムを書くために志願しました。

InputThe入力ファイルは、いくつかのテストケースで構成されています。各テストケースは、利用可能なマップの単一の整数nを(1 <= N <= 100)を含む行から始まります。N次の行は、一つのマップそれぞれを記述する。これらの線のそれぞれ4つの数字X1を含み、Y1、X2、Y2(0 <= X1 <X2 <= 100000; 0 <= Y1 <Y2 <= 100000)、必ずしも整数。値(X1、Y1)と(X2、Y2)が左上RESPの座標です。マッピングされたエリアの右下隅。

入力ファイルは、単一の0がit.OutputFor各テストケースは、プログラムする必要があり、出力1セクションを処理しないを含む行で終了します。各セクションの最初の行(1から始まる)kは、テストケースの数であり、「テストケース#K」でなければなりません。小数点の右側には、2つの数字に正確に印刷された総探求領域(このテストケース内のすべての矩形の和集合のすなわち面積)であり、:もう一つは「A合計エリアを探検」しなければなりません。

出力各テストケースの後に空白行。
サンプル入力
2 
10 10 20 20 
15 15 25 25.5 
0
サンプル出力
テストケース#1 
総探求面積:180.00

#define LSON << 1 I、L、M個。
 の#define rson I << 1 | 1 ,. 1 + Mは、R。。
 CONST  INT MAXN = 222 ;
 ダブルX [MAXN];
 構造体ノード
{ 
    ダブル Lは、R、H; // 左右の座標、高度
    INT D; // タグ上縁または下縁
    ノード(){} 
    ノード(ダブル L、ダブル R&LT、ダブル H、int型D):L(L)は、R(R&LT)、H(H)、 D(D)} {
     BOOLの 演算子 <(CONSTノードA&)のconst 
    { 
        リターン H < AH; 
    }
}行[MAXN]。
INT CNT [MAXN << 2 ]。
二重和[MAXN << 2 ]。
ボイド押し上げ(int型 I、int型の L、int型R)
{ 
    場合(CNT [i])と
        の和[I] = xで[R + 1 ] - X [L]。
    他の
        合計[I] =合計[I << 1 ] +合計[I << 1 | 1 ]。
} 
//        更新(L、R、ライン[I] .D、1,1、K-1)。
アップデート(int型 QL、int型 QR、int型の V、int型 Iを、int型の L、INT R)
{ 
    場合(QL <= L && QR> = R)
    { 
        CNT [I] + = V。
        押し上げ(I、L、R)。
        返します
    } 
    INT M =(L + R)>> 1 もし(QL <= m)の更新(QL、QR、V、LSON)。
    もし(QR> m)の更新(QL、QR、V、rson)。
    押し上げ(I、L、R)。
} 
int型のmain()
{ 
    int型Q;
    int型加瀬= 0 ;
    一方、(CIN >> Q && Q)
    { 
        memsetの(CNT、0はsizeof(CNT))。    //
         memsetの(合計、0はsizeof(合計));    // 存储线段
        INT、N = 0、M = 0 以下のためにint型 iは= 1 ; I <= Q iは++ 
        { 
            ダブルX1、Y1、X2、Y2。
            scanf関数(" %LF%LF%LF%LF "、&​​X1、Y1&、&X2、およびY2)。
            X [ ++ N] = X1と、
            X [ ++ N] = X2と、
            ライン[ ++ M] =ノード(X1、X2、Y1、1 )。
            ライン[++ M] =ノード(X1、X2、Y2、 - 1 )。
        } 
        ソート(X + 1、X + 1 + N)。
        ソート(ライン + 1、ライン+ 1 + M)。
        int型のk = 1 
        K =ユニーク(X + 1、X + N + 1)-X- 1 二重 ANS = 0.0 以下のためにint型 i = 1 ; iがm <; iは++ 
        { 

            int型 L = LOWER_BOUNDを(X + 1、X + K + 1、ライン[I] .L) - X。
            INT R = LOWER_BOUND(X + 1、X + K + 1、ライン[I] .R) - X。
            R - ;
            もし(L <= r)が更新(L、R、ライン[I] .D、11、K- 1 )。
            ANS + =和[ 1 ] *(ライン[I + 1 ] .h- ライン[I]・H)。
        } 
        のprintf(" テストケース#%D \ n総探求領域:%.2f \ n \ n "、++ 加瀬、ANS)。
    } 
}

 

おすすめ

転載: www.cnblogs.com/Shallow-dream/p/11756311.html
おすすめ