이진 검색 (대형 배낭)

https://ac.nowcoder.com/acm/contest/889/D

#INCLUDE <비트 / stdc ++ H.>
 사용  스페이스 성병;
// __ 
#DEFINE PB와 push_back 
형식 정의  LL; 
타입 정의 부호없는  날개 펼진;
구조체 노드 {
     INT의 NUM; 
    ULL 합; 
} A [ 1 << 19 ] (B)의 [ 1 << 19 ];
부울 CMP (노드 P 노드 Q) {
     복귀 p.sum < q.sum; 
} 

INT 의 main () {
     INT의 N; 
    ULL의; 
    scanf와 ( " % d 개 %의 LLU" , N, S)
     INT 레나 = 1 , lenb = 1 ;
     INT 된 P = N / 2 ]
     에 대해 ( int로 I = 0 나 P <; 내가 ++ ) { 
        ; ULL의 X 
        는 scanf ( " %의 LLU " , X를 )
         INT m = 레나]
          ( INT의 J = 0 ; J <m, J ++ ) { 
            A [레나] .num = (a [J] .num | ( 1 << I)) 
            이 [레나] .sum = A [J] .sum + X, 
            레나++ ; 
        } 
    } 
    에 대해 ( int로 난 = P를, 난 <N; i가 ++ ) { 
        ULL의 X를; 
        scanf와 ( " %의 LLU " , X);
        INT m = lenb;
         ( INT의 J = 0 ; J <m, J ++ ) { 
            [lenb] .num B = (B [J] .num | ( 1 << I)); 
            B [lenb] .sum = B [J] .sum + X; 
            lenb ++ ; 
        } 
    } 
    정렬 (a하는 + 레나, CMP); 
    정렬 (B, B 형 +lenb, CMP);
    INT의 L = 0 , R = lenb- 1 ;
    반면 (L < 레나) {
         동안 (a [1] .sum + B [R] .sum> S && R) 
            (R) - ;
        경우 (a [1] .sum + B [R] == .sum S)
             파괴 ; 
        리터 ++ ; 
    } 
    에 대해 ( int로 I = 0 ; I는 (< INT ) N / 2 나 ++; ) 
        의 printf ( " %의 D " (A [1] .num >> I) 1 );
    대한 ( INTI = INT (N / 2 ) 내가 <N; I ++는 ) 
        에서 printf ( " %의 D " , (b [R] .num >> I) 1 );
    반환  0 ; 
}
코드보기

 

추천

출처www.cnblogs.com/starve/p/11360114.html