N-소, 1 ~ N의 높이로 알려진 다양하지만, 각 젖소의 정확한 높이를 모를 수 있습니다.
이제, n은 암소 서 소 이전 제가 알려져있다 I 는 각 암소의 높이를 필요 이상으로 아이 암소 이하이다.
입력 형식
1 호선 : 입력 정수 n.
첫번째 행 2..n : 라인 당 정수 제가 아이는 i 번째 행은 소가 I 갖는 것을 나타낸다 나 그 이하의 AI 소. (: 제 암소의 전면에는 소가 없기 때문에, 그래서 나열되지 않은 주)
출력 형식
N 개의 출력 라인 높이 정수 가축의 각 출력 라인을 포함하는 방법.
i 번째 행 I 암소 높이의 출력.
데이터 범위
1 ≤ N ≤ 10 5 1≤n≤105
샘플 입력 :
5
1
2
1
0
샘플 출력 :
2
4
5
3
1
해결 방법 :이 질문은 단지 N 헤드 높이가 동일하지 않기 때문에 소, 가축을 찾을 권리가있다, 그래서 우리는 지금까지 사용 된 소 가축의 현재 높이를 기록하는 나무와 같은 배열을 구축 할 수 있습니다 (값의 나무와 같은 배열 표현 펜윅 트리 기본 오름차순으로 행하기 때문에 현재의 모든 가축은 가축 그래서 지금 우리가보다 얼마나 많은 머리 인당 가축의 짧은 앞을 통과하는 역 할,) 높은 몇몇의 첫번째에서 사용되지 않는 것입니다 그 도착 어레이 (전류 값 자체가 소 도착 인 [I]는 + 1), 우리는 도착 소 어레이의 이진 트리를 찾는 [내가] + 1 개 높이, 그리고 트리에서 어레이에 기록 이 암소 뺀다, 상기 동작은 N 회 반복된다.
사용법 #include <iostream> #INCLUDE <cstdio> 사용 스페이스 성병; CONST의 INT maxn 1E5 + = 7 ; INT의 N; INT의 트리 [maxn]; // 01标记N头牛是否使用过INT 도착 [maxn]; INT ANS [maxn]; INT lowbit ( INT X) { 복귀 , X (- X); } 공극 추가 ( INT (X), INT 브로) { 동안 (X <= N) { 트리 [X] + = 브로; X + = lowbit (X); } } int 치 ASK ( INT X) { INT RES = 0 ; 그동안 (X> = 1이다. ) { RES + = 트리 [X] X - = lowbit (X) } 리턴 RES; } INT (주) { scanf와 ( " D의 % " , N-), 추가 ( . 1 , . 1 ); // 모든 가축이 추가 된 펜윅 나무 에 대한 ( int로 I = 2 ; I <= N-, 나는 ++ ) { 는 scanf ( " % D" , ARR [I]) 추가 (I, . 1 )] } 에 대한 ( INT I = N-; I> = 1이다. ] 난 ...) { // 반전 이송 소 찾아야 INT의 L이 = 1. , R & LT = N-; 그동안 (L <R & LT) { // 반 눌러보고 [I]가 소 + 1 도착 높이 현재 전면 암소 도착 [I] 그것보다 짧은 소로서 (순서, 제 자신 도착 [I은 ] 소 + 1) 값 int MID = (L + R 및 LT) >> 1 ; IF는 ((MID 문의) <ARR을 [I] + 1 ) { L = MID + 1 ] } 사람의 = { R & LTMID; } } ANS [I] = & lt; 화학식 추가 (R & LT, - . 1 ); // 암소는 현재 사용되고 있기 때문에,이 (태그 배열을 제거 트리) 감산 있도록 } 대 ( INT I = . (1) , I <= N-; I ++ ) { 의 printf ( " % D의 \의 N- " , ANS [I]) } 리턴 0 ; }