주제 주소 : POJ 2828 티켓 구매
기술
철도 티켓은 중국의 음력 새해의 주위에 살 어려운, 그래서 우리는 일찍 일어나 긴 대기열에 가입해야합니다 ...
설날이 다가오고 있지만, 불행하게도 작은 고양이는 여전히 한 일정은 여기 저기 가고. 이제 그는 정보학 올림픽 대표팀의 겨울 캠프 선택에 면양, 쓰촨성 기차로 여행해야했다.
그것은 하나의시 방향이고 어두운 외부이었다. 큐에있는 사람들을 놀라게하지 않았다 북서쪽에서 바람을 진정. 차가운 밤 작은 고양이에게 전율을 주었다. 이유에 대해 생각하는 문제를 찾을 수 없습니다? 즉 죽음에 동결보다 아무도에게 덜 나은 없었다!
사람들은 큐를 점프 유지. 이 주변에 너무 어두웠 때문에, 이러한 움직임은 심지어 큐 점퍼 옆에있는 사람들에 의해 발견되지 않을 것이다. "큐 - 점프가 주어진 후 그들은 내가 큐에있는 사람들의 마지막 순서를 찾을 수 있습니다, 어디에 서 큐에있는 모든 사람이 대기열을 뛰어 사람들에 대한 적분 값과 모든 정보를 할당하는 경우?"생각 작은 고양이.
입력
입력에서 여러 테스트 케이스가 될 것입니다. 각 테스트 케이스 구성 N + 1 개 라인 N은 (1 ≤ N 200,000 ≤) 테스트 케이스의 첫 번째 줄에 제시되어있다. 다음 N의 라인 값의 쌍을 포함 순위 I 및 브로 I 의 증가 순서 I (1 ≤가 나는 ≤ N을 ). 각 난 의 범위의 의미 및 순위는 I 및 브로 난 다음과 같다 :
- 순위는 내가 [0 ∈ 내가 더 - - 1] 내가 번째 사람이 큐에 와서 바로 뒤에 서 있었다 포스 내가 대기열에 사람을 번째. 예약 사무실은 큐의 최초의 사람으로 간주 된 큐의 선두에 0 번째 사람과 사람으로 간주되었다.
- 발은 내가 더 - [0, 32767] ∈ I 값 할당 번째 사람 브로 난을 .
이 테스트 케이스 사이에 빈 줄. 입력의 끝으로 이동합니다.
산출
각 테스트 케이스의 경우, 출력 그들이 큐에 서 순서에있는 사람들의 값입니다 공백으로 구분 된 정수의 한 줄.
샘플 입력
4 0 77 1 51 1 33 2 69 4 0 20,523 1 19,243 1 3890 0 31,492
샘플 출력
(77) 33 (69) 51 31,492 20,523 3,890 19,243
힌트
아래의 그림은 작은 고양이 샘플 입력의 첫 번째 테스트 예제에 설명 된 큐에있는 사람들의 마지막 순서를 발견하는 방법을 보여줍니다.
![](http://poj.org/images/2828.gif)
질문의 의미 :
큐를 점프 할 때 티켓 대기열.
삽입과 그의 val_i 할 pos_i 사람의 위치를 나타내는 몇 개의 쌍을 지정, 발은 큐의 마지막 순서를 얻을.
분석 :
이것은 매우 영리한 제목입니다.
고정 사람 위치의 최종 위치에 삽입 관찰 우리는 후방으로부터 삽입 할 수 있고, POS는, 발 발은 POS 앞에 위치 POS 따로 그 다음에, 대표적인 pos 위치에 삽입되도록,
우리는이 결정되면, 위치 뒤에 사람들이 변경되지 않습니다 역의 뒤쪽에서 시작, 반대 간주 될 수 있으며, 가정의 사람들이 바로 이곳 뒤에 서서 한 다음 때 그 사람 역, 현재 위치 숫자 NUM 공간만큼, 뒷면에 이미, 그리고 개별 스테이션의 위치를 결정 할 수있는 사람들.
예를 들어, crazy_apple의 예에서,시에 ~
세그먼트 트리 노드 번호는이 단락의 간격에 저장 한 다음 POS를 삽입 역 :
예를 들어 77 0
. 1 51 인
(1) (33)이다.
(2) (69)
먼저 인출 : 2 69 - - -69- - (전방 삽입구 (3)에 필요)
그런 다음 걸릴 : 1 33 --- 33--69 --- (두 개의 전면 공간에 삽입하는 데 필요한)
이어서 취할 151 --- 33--69- -51- (2 갭 앞에 삽입해야 함) 후방 공간으로 전방 만 간극 있도록
그런 다음 걸릴 : 0 77-77--33--69- -51- (삽입하는 데 필요한 공간의 앞에)
1 #INCLUDE <STDIO.H> 2 #INCLUDE < 문자열 .H> 3 #INCLUDE <iostream> 4 #INCLUDE < 문자열 > 5 #INCLUDE <math.h> 6 #INCLUDE <알고리즘> 7 #INCLUDE <큐> 8 # 포함 < 설정 > 9 #INCLUDE <math.h> 10 CONST INT INF = 0x3f3f3f3f ; 11 의 typedef 긴 긴 LL; 12 CONST의 INT maxn 2E5 + = 10 ; (13) 사용하여 네임 스페이스를STD; 14 (15) INT N-; 16 INT 추가 [MAXN << 2 ] // 갭 번호 . 17 INT의 POS [MAXN]; // 삽입 위치 18 INT 브로 [MAXN]; // 초기 값 . 19 INT의 ANS의 [ MAXN]; // 최종 스테이션 (20)은 (21)은 공극 빌드 ( INT의 L, INT의 R & LT는 INT RT) (22)가 { 23 인 추가 [RT]을 L - R & 중위 + = 1이다. ] // 갭의 초기 번호 24 IF (L == R & LT) 25 리턴 ; 26는 INT에서 m = (L + R 및 LT) >> . 1 ; 27 빌드 (L, m, RT << 1. ) 28 빌드 (m의 +를 1. , R & LT, RT를 << 1. | 1. ) (29) } (30) (31)가 하는 int 업데이트 ( INT의 L, INT의 R & LT, INT NUM, INT RT) // NUM 중단은 공극의 수가 앞에 필요한 32 { 33 인 추가 [RT] -; // . 갭 번호 저장 1 (34)은 IF (L == R & LT) 35 리턴 L; // 삽입 위치를 반환 36 의 INT = (L + R 및 LT) >> m . 1 ; 37 IF (추가 [RT << 1이다. ]> = NUM) // 이상의 삽입의 삽입 위치의 좌측에 동일한 좌측 아이 스페이스 경우 38 인 업데이트 (L, m, NUM , RT << 1이다. ) (39) 다른 // 수가 마이너스의 왼쪽에 삽입 될 NUM 빈 NUM 왼쪽 공간 오른쪽 삽입 오른쪽 위치 미만이면 40 { 41 납입 추가 = RT << 1이다. ]은, 42 업데이트 (m의 + . (1) , R & LT, NUM, RT << 1. | 1. ) (43)이다 } 44이다 } 45 46는 INT 주 () 47 { 48 그동안(~는 scanf ( " %의 D " , 및 N-)) 49 { 50 빌드 ( 1. , N-, 1이다. ) (51)는 에 대해 ( INT I = . 1 ; I <= N- I가 ++ ) (52)가 { 53은 scanf와 ( " %의 D %의 D " , POS [I], 브로 [I]); 54이다 } 55 대 ( INT I는 => N - I = 1. , 난 -) // 업데이트를 반전은, 최종 위치 결정된다 (56)되어 { 57는 INT 키 업데이트 = ( 1, N-, POS [I] + 1. , 1. ); //가 삽입되는 공간 (58) ANS하는 열쇠 브로 = [I]; // 저장 ANS 어레이 (59) } (60) 에 대한 ( INT I = 1. ; I <= N-; ++ 나 ) (61)는 { 62 인 경우 ! (I는 = . 1 ) (63)는 의 printf는 ( " " ) 64 의 printf ( " %의 D 」], ANS [I]) 65 } 66 의 printf ( " \ N-는 " ); (67) } 68 반환 0 ; 69 }