https://ac.nowcoder.com/acm/contest/889/D
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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 ; }