티켓 구매 POJ - 2828 (트리 라인, 단일 지점 업데이트, 쿼리 간격)

주제 링크 : 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 }

 

              

추천

출처www.cnblogs.com/SSummerZzz/p/12552478.html