p2619 [ナショナルチーム2]ツリーI [WQS半分学習]

分析

https://www.cnblogs.com/CreeperLKF/p/9045491.html

とにかく、このブログは右側にNBを探します

しかし、彼はスペードを知りません

WQSは、実際に[X]凸包の最適解xを選択したグループが満たされる表す元のバイナリ値DPであります

あなたは半数その後、することができます

クラスの重みの合計数と、この二分法の数には限界があるように、

その後、我々は判断することができます

この質問は、一般的なテンプレートのタイトルです

コード

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
const  int型 INF = 1E9 + 7 INTの N、M、和、RES、CNT、TOT、FA [ 100100 ]。
構造体ノード{
     int型X、Y、Z、COL。
}。
ノードD [ 100100 ]、D1 [ 100100 ]。
インライン「再 SFは(あなたが X){ 戻り FAを[X] == X X:FA [X] = SF(FA [X]);}
インラインブール CMP(CONSTノードx、CONSTノードy){ 戻り x.col <y.col XZ == YZ:XZ <?をYZ;}
インラインINT CK(INT MID){
     int型I、J、K。
    (i = 1 ; I <= M; iは++)D [i]は=のD1 [I];
    (i = 1 ; iが<= M; iは++)場合、D [i]が.Z + =(D [i]は.COL!)ミッド。
    何も =すべて= CNT = 0 ;
    (i = 1 ; iが<= N; iは++)を行い、[I] = I。
    ソート(D + 1、D + M + 1 、CMP)。
    (i = 1 ; I <= M iは++ ){
       intは、X = D [i]を.X、Yは= D [i]の.Yと、
      もし(SF(X)!= SF(Y)){
          4 [辞書(X)] = 辞書(Y)。
          CNT ++ ; + = D [i]は.Z。
          もしすべて++(!D [i]の.COL) 
      }
      もし(CNT == N- 1ブレーク
    }
    戻りTOTを。
}
INT のmain(){
     int型 I、J、K、= - 200、R = 200 
    scanf関数(" %D%D%D "、&​​N、&M、および合計);
    (i = 1 ; I <= M; iは++)のscanf(" %D%D%D%D "、およびD1 [I] .X、&D1 [i]は.Y、&D1 [i]が.Z、&D1 [I ] .COL)、D1 [I] .X ++、D1 [I] .Y ++ 一方、(RI-ル> 1 ){
       int型ミッド=(LE + RI)>> 1 もし(CK(中)> =合計)ル= ミッド;
        他の里= ミッド;
    }
    CK(LE);
    printf(" %d個の\ nを"、RES-合計* ル)。
    リターン 0 ;
} 

 

おすすめ

転載: www.cnblogs.com/yzxverygood/p/11669406.html