2020ICPC 게임 자갈 백은 새로운 게임 타이틀 만족

https://ac.nowcoder.com/acm/contest/4010/C

이 질문은 하나 개 베어 님 게임 유형;

(1 ~ N) 전에 청구 프로그램 스택에서 승리하기 위해 결정된다.

이러한 유형의 경우, 우리는 이제 제 (K)를 적재하는 경우, 우리는 먼저 단독 또는 적층 전에 배타적 OR 값 (K);

다음 동작 (k)의 각 스택 : TMP = 합 ^ A [i]는, 배타적 OR XOR 항목의 합계치가 나는 한 값보다 작 으면 [I] 프로그램 번호 +1;

그러나,이 방법은 N ^ 2의 복잡도이고;

우리는 각 이진 값이 유지됩니다 스택-K의 사전 필요가 그래서;

그리고 가장 중요한 비트, 즉, 다음 인덱스 번호의 번호가 저장되어, 배타적 논리합의 총 인덱스 값을 열거하는 방법에 많은 프로그램의 종류;

이유는, 총 XOR 값이 하나 XOR 수 있으면되므로 그 다음, 이하 A [i]를 초과 할 것, 전체 배타적 OR 값 인덱스가 A [i]를 XOR 중 어느 하나를 보유하고 있음을 증명하는 것이기에 이 모두 1이다이고;

XOR은 0이 합계 ​​값 배타적 OR 후에, 이것은 [I]보다 확실히 작다;

1 #INCLUDE <비트 / stdc ++ H.>
 2  사용  공간은 수 std;
3  CONST  INT maxn 1E5 + = 1 ;
4 형식 정의  LL;
5 줄게 A [maxn, NUM [maxn, 합계 = 0 ;
6  INT의 주 ()
 7  {
 8      INT N;
도 9      는 scanf ( " %의 D ' , N);
10       ( INT 난 = 1 ; 나는 <= N; ++ i)는 {
 11          는 scanf ( " %의 LLD을" , & A [I]);
 12          합 ^ = A [i]는,
 13           ( INT J = 0 ; J < 62 ; ++ j)에 {
 14              의 경우 ((a [I] >> J) 1 ) NUM [J] ++ ;
 15          }
 16          의 경우 (합계 == 0 ) {
 17              의 printf ( " 0 \ n " );
 (18)는              계속해서 ,
 19          }
 20          LL t = 합 CNT = - 1 ;
 21          동안 (t) CNT ++, t는 >> = 1 ;
22          의 printf ( " %의 LLD \ n " , NUM [CNT]);
23      }
 24      반환  0 ;
25 }

 

추천

출처www.cnblogs.com/pangbi/p/12292639.html