주제 링크 : https://i-beta.cnblogs.com/posts/edit
아이디어는 : 입력 데이터의 반대를 고려, 그의 대신 입력 X X 개인의 위치가 이전에 존재하고,
그러나 나중에 사람들이 큐를 이동합니다 다음 몇 가지 공석 앞에이 있어야한다, 사람이 X로 표현 될 수있다 이미있다.
우리는 이송 위치 사이의 반비례 관계이기 때문에, 우리는 단지 공석 X 번호를 가질 수 어레이 앞에 유지할 필요가있다.
1 #INCLUDE <iostream> 2 #INCLUDE <알고리즘> 3 #INCLUDE <지도> 4 #INCLUDE <큐> 5 #INCLUDE < 문자열 > 6 #INCLUDE <적층> 7 #INCLUDE <벡터> 8 #INCLUDE <일람> 9 # 포함 <cstdio> 10 #INCLUDE <CString을> 11 #INCLUDE <cmath> 12 사용 공간은 수 std; 13 #DEFINE의 긴 긴 LL 14 #DEFINE PB와 push_back 15 #DEFINE의 인터넷 제 16 #DEFINE SE 번째 17 #DEFINE의 LSON (X) × 1 << 18 #DEFINE rson (x)는 X << 1 | 1 19 20 21 CONST INT N = + 2E5 (10) ; 22 구조체 노드 { 23 INT의 L, R, 빈; 24 INT의 중간 () { 창 (리터의 R +) >> 1 ; } 25 } 트리 [N << 2 ]; 26 의 INT INX [N] V [N] 케 [N]; 27 INT N, 팀; 28 29 공극 build_tree ( INT의 RT, INT l_b, INT의 R_B) { 30 트리 [RT] .L = L_B, 트리 [RT] .R = R_B; 31되는 IF (L_B == R_B) { 32 트리 [RT]가 =이 .blank 1. ; // . 위치 1 개 대표 33 인 창 ; 34이다 } 35 INT MID = 트리 [RT] .MID (); 36 build_tree (LSON (RT) L_B, MID); 37 build_tree (rson (RT) + MID 1. , R_B) 38 인 트리 [RT] = 트리 .blank [LSON (RT)를] + 블랭크. 트리 [rson (RT)] 빈 ;. 39 } 40 41이다 // 빼기 위치 (42) 인 공극 (업데이트INT X) { 43은 그동안 (X! = 1이다. ) { 44 인 트리 [X] .blank - = 1. ; 45 X = >> . 1 ; 46이다 } 47 } 48 49 // 이 위치 검색 50 보이드 검색 ( INT RT, INT TOT, INT V) { 51는 IF (트리 [RT] .L == 트리 [RT] .R) { 52은 케 [트리 [RT]는 .L] = V는, 53이다 업데이트 (RT) (54)는 창 , 55 } 56은 //이 온이 위치는 왼쪽으로 57 IF (. 트리 [LSON (RT)] 빈> = , TOT) 검색 (LSON (RT), TOT, V) (58) // 우측이 위치 59 다른 검색 (rson (RT), - TOT 트리 [LSON (RT)] 빈, V); 60 (61)이다 } (62)가 63 인 공극 () {해결 64 그동안을 (~는 scanf ( " %의 D " 및, N-)) { 65 팀 = 0 ; 66 build_tree를 ( 1. , 1이다. ), N-] 67 대 ( INT I = 1. ; I <= N-; I ++)는 scanf (" % D % D " + I +, INX, V, I); 68 대 ( INT , I> = 1, N = 1 - I) { 69 검색 ( 1 , INX [I] + 1 , V [I]); 70 } 71 의 printf ( " %의 D " , 케 [ 1 ]); 72 대 ( INT 난 = 2 ; 나는 <= N; ++ I) { 73 의 printf ( " %의 D " , 케 [I]); 74 } 75 의 printf (" \ n " ); 76 } 77 } 78 79 INT 의 main () { 80 (81) // IOS :: sync_with_stdio (FALSE); 82 // cin.tie (0); cout.tie (0); 83 ) (해결; 84 85 복귀 0 ; 86 }