제목 설명
길이 n의 정수의 시퀀스가 오퍼레이션 두 가지 종류가있다 :
0 LR 알 일부 번호를 선택 ... 그들의 XOR 합이 최대이고, 상기 최대 값을 출력하도록 AR.
X는 1 : 시퀀스의 끝에 X를 추가 및 N = N + 1하자.
0 LR 알 일부 번호를 선택 ... 그들의 XOR 합이 최대이고, 상기 최대 값을 출력하도록 AR.
X는 1 : 시퀀스의 끝에 X를 추가 및 N = N + 1하자.
기입
여러 테스트 케이스가 있습니다. 입력의 첫 번째 라인은 테스트 케이스의 수를 나타내는 정수 T (T≤10)을 포함한다.
각 테스트 케이스의 경우 :
첫 번째 라인은 두 정수 N, m (1≤n≤5 105,1≤m≤5 × × 105), 시퀀스에서 처음 정수의 숫자 및 연산의 수를 포함한다.
두 번째 행은 N 개의 정수 A1, A2, ..., (0≤ai <230)의 초기 시퀀스를 나타내는을 포함한다.
다음의 m 라인의 각각은 상기 소정의 동작 중 하나를 포함한다.
그것은 Σn≤106, Σm≤106,0≤x <230 보장합니다.
그리고 작업은 암호화됩니다. 당신은 lastans 마지막 0을 입력 동작에 대한 답을 나타내며, 처음에 제로로는 다음 작업을 디코딩해야합니다
모든 유형 0 동작을 위해 개조 N + 1, R = ((R)의 배타적 lastans) 개조 N + 1, L = (L 개의 배타적 lastans)을하게하고 교체 (L, R)의 경우 L> R.
모든 유형 1 작동을 위해, X = X XOR의 lastans을 할 수 있습니다.
각 테스트 케이스의 경우 :
첫 번째 라인은 두 정수 N, m (1≤n≤5 105,1≤m≤5 × × 105), 시퀀스에서 처음 정수의 숫자 및 연산의 수를 포함한다.
두 번째 행은 N 개의 정수 A1, A2, ..., (0≤ai <230)의 초기 시퀀스를 나타내는을 포함한다.
다음의 m 라인의 각각은 상기 소정의 동작 중 하나를 포함한다.
그것은 Σn≤106, Σm≤106,0≤x <230 보장합니다.
그리고 작업은 암호화됩니다. 당신은 lastans 마지막 0을 입력 동작에 대한 답을 나타내며, 처음에 제로로는 다음 작업을 디코딩해야합니다
모든 유형 0 동작을 위해 개조 N + 1, R = ((R)의 배타적 lastans) 개조 N + 1, L = (L 개의 배타적 lastans)을하게하고 교체 (L, R)의 경우 L> R.
모든 유형 1 작동을 위해, X = X XOR의 lastans을 할 수 있습니다.
수출
각 유형 0 동작주세요 출력 한 줄의 최대 XOR 합.
샘플 입력
1
3 3
0 1 2
0 1 1
1 3
0 3 4
샘플 출력
1
3
질문의 의미
쿼리 간격 [L, R은 상기 최대의 XOR이다.
공식 해결 방법 :
연습 폭력은 데이터베이스 구간 선형 구조를 유지할 수 있습니다, 그러나 확실하게 전달할 수 없었다.
각 그룹 프리픽스 선형 염기 서열 (삼각형), 선형을 유지 욕심 오른쪽에 위치 번호는 가능한 한 높은 나타나는
동시에 디지털상의 대응 위치를 기록하는 시간의 새로운 번호 삽입되었는지 위치에 출현하고, 상기 시간을 찾기 위해 위치에 삽입 될 수있는 경우에 디지털 로우 푸시의 원래 위치에 원래 번호 위치보다 오른쪽에 상기 새로운 도면.
낮은 통과 높은 중 최대 값을 선택했을 때 비트 간격의 좌단의 오른쪽에 번호가 질의에 나타나고 응답이 크게 할 수있는 경우, 상기 배타적 OR에 대한 응답이다.
모든 선형 그룹의 경우, 그것은 더 높은 위치가 확실히의 오른쪽에 나타납니다 (또는 해당 위치에 삽입됩니다)에 따라 독점 또는 디지털 선형을했다, 그래서 연습은 분명 정확성이다.
선형 그룹 :
https://blog.csdn.net/a_forever_dream/article/details/83654397
https://blog.sengxian.com/algorithms/linear-basis?tdsourcetag=s_pctim_aiomsg
#INCLUDE <. 비트 / stdc ++ H> #DEFINE가 긴 긴 것이다 사용 스페이스 성병; CONST의 INT N = 5e5 + (10) ; INT T, N, m; INT의 P [N] [ 31 ], POS [N] [ 31 ]; 보이드 추가 ( INT 계산해 의 INT (X)) { 위해 ( int로 I = 0 ; I는 <= 30 , P [X] [I] = P [X-] 난 ++) (1) [I], POS [X] [I] = POS [X- 1 ] [I]; int로 지금 = X; 위한 ( int로 난 = 30 , I> =0 ; 난 ... ) 의 경우 (발 & ( 1 << I)) { 경우 라! ( P [X] [I]) { P [X] [I] = 브로; POS [X] [I] = 현재; 휴식 ; } 경우 (POS [X] [I]가 < 지금) 스왑 (p [X] [I], 발), 스왑 (POS [X] [i]는, 현재); 브로 ^ = P [X] [I]; } } INT의 쿼리 ( INT의 L, INT의 R) { INT RET = 0 ; 대 ( INT J =30 ; J> = 0 ; j-- ) 경우 POS ([R] [J]> = 1 && (RET ^ P [R] [J])> RET) RET ^ = P [R] [J] 반환 RET를; } INT 의 main () { // freopen을 ( "1.in", "R", 표준 입력); // freopen을 ( "1.out", "w", 표준 출력); scanf와 ( " %의 D ' , T); 반면 (T-- ) { 는 scanf ( " %의 D % d에 " , N, m); INT의 OP, X, L, R; { 는 scanf ( " %의 D ' , X); 추가 (X, I); } INT lastans = 0 ; 반면 (M-- ) { 는 scanf ( " %의 D " , OP); 경우 (연산 == 0 ) { 는 scanf ( " % d 개 %의 D ' , L, R); L = (L ^ lastans) %의 N + 1 ; R = (R ^ lastans) %의 N + 1 ; 경우 (L>R) - 스왑 (L, R); lastans = 쿼리 (L, R); 의 printf ( " % D \ 없음 " , lastans); } 다른 { 는 scanf ( " %의 D ' , X); X ^ = lastans; N ++ ; (X, n)에 추가; } } } // FCLOSE (표준 입력) // FCLOSE (표준 출력); 반환 0 ; }