分析
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 ;
}