3262 Moの花 - BZOJ

3262:Moの花

制限時間:20秒   メモリ制限:256メガバイトの
提出:5433   解決:2623
[ 送信 ] [ ステータス ] [ 議論 ]

説明

フラワー(S)、色(C)、臭気(M)、三つの整数で表される:N-花は、それぞれの花は3つの属性を有しています。
今、それぞれの花の評価のために、花のレベルは、それが美しさを超えることができた花の数です。
Bより美しい別の花の花の定義は、場合にのみサ> = Sbのカリフォルニア州> = Cbの、馬> = Mbの。
明らかに、2つの花は同じ属性を有することができます。各クラスのために必要な花の数のトップ統計。
 

入力

最初の行のN、K(1 <= N <= 10万、1 <= K <=20万)、それぞれ、花の最大数は、属性値。
三つの整数のSI、CIの次のNライン、MI(1 <= SI、CI、MI <= K)は、iが属性の花を表します

出力

それぞれ、N個の行を含む、数はN-1 ... 0の花の各段階の評価ことを示しています。

サンプル入力

3 10
3 3 3
2 3 3
2 3 1
3 1 1
3 1 2
1 3 1
1 1 2
1 2 2
1 3 2
1 2 1

サンプル出力

3
1
3
0
1
0
1
0
0
1

ヒント

 

ソース

 最初の3次元部分オーダーコードCDQ
#include <ビット/ STDC ++ H>
 に#defineっ長い長
 の#define LSONのL、M、RT << 1つ
 の#define rsonのM + 1、R、RT << 1 | 1つ
 の#define 0x3f3f3f3f INF
 の#defineのEPS 1E-6
 使用して 名前空間はstdを、
const  int型 MAXN = 100005 ;
構造体ノード{
     int型X、Y、Z、CNT、ANS。
} P [MAXN]。
int型のツリー[MAXN * 2 ]、K、ANS [MAXN]。
INT lowbit(INT X){
     戻り X&( - X)。
} 
ブール cmpx(CONSTノードU、CONSTノードv){
     場合(UX == VX && u.y == VY)
             を返す UZ < VZ。
    もし(UX == VX) 
         の戻り UY < VY。
    返す UX < VX。
} 
ブール cmpy(CONSTノードU、CONST ノードv){
       場合(UY == VY && u.z == VZ) 
           を返す UX < VXと、
        もし(UY == VY) 
             を返す UZ < VZ。
        リターン UY < VY。
} 
無効アドオン(int型X、int型のval){
     一方(X <= K){ 
        ツリー[X] + = ヴァル。
        X + = lowbit(X)。
    } 
} 
int型の照会(INT X){
     int型 ANS = 0 一方、(X){ 
        ANS + = ツリー[X]。
        X - = lowbit(X)。
    } 
    戻りANS。
} 
ボイド CDQ(int型 L、INT R){
     場合(L == R){ 
        P [L] .ans + = P [L] .cnt- 1;
        返します
    } 
    INT M =(L + R)>> 1 
    CDQ(L、M)。
    CDQ(M + 1 、R)。
    ソート(P + L、P + 1 + M、cmpy)。
    ソート(P + 1 + M、P + 1 + R、cmpy)。
    int型 J = リットル;
    以下のためにint型 I = M + 1 ; I <= R; iは++ ){
         一方(J <= M && P [j]が.Y <= P [i]は.Y){ 
            追加(P [j]が.Z、P [J] .CNT); 
            J ++ ; 
        } 
        P [i]は.ans+ = クエリ(P [i]の.Z)。
    } 
    のためにint型 I = 1と、iがjで<; iは++ 
        (P [i]が.Z、追加 - P [I] .CNT)を、
} 
int型のmain(){
     int型 N、TOT = 0 
    scanf関数(" %d個の%のD "、&​​N&K)。
    以下のためにint型 i = 1 ; iが<= N; iは++ ){ 
        scanf関数(" %D%D%D "、&​​P [i]は.X、&P [i]は.Y、&P [i]の.Z)。
        P [i]は.ans = 1 
    } 
    ソート(P + 1、P + 1+ N、cmpx)。
    以下のためにint型 i = 1 ; iは= N <; iは++ ){
         もし!(I = 1つの && P [i]は.X == P [I- 1 ] .X && P [i]は.Y == P [I- 1 ] .Y && P [i]は.Z == P [I- 1 ] .Z){ 
            P [TOT] .CNT ++ 
        } { 
            P [ ++ TOT] = P [i]は、
            P [TOT] .CNT = 1 
        } 
    } 
    CDQ(1 、TOT)。
    以下のためにint型 I = 1 ; I <= TOT; iは++ ){
        ANS [P [i]は.ans] + = P [i]は.CNT。
    } 
    のためにint型 I = 1を iが++; iが<= N ){ 
        COUT << ANS [I] << " の\ n " 
    } 
    戻り 0 
}
コードの表示

 

 

おすすめ

転載: www.cnblogs.com/MengX/p/11184709.html