루오 구 P1972 [SDOI2009] HH 목걸이 (펜윅 나무, 오프라인)

문제 해결 아이디어

그것은 수요 간격의 다른 유형의 수이다, 그래서 우리는 펜윅 나무 사용하기 때문에 (그리고 겉으로 직접 접촉)

(... 표현하는)

또는, 원본과 동일한 s 인 [I]는 종류의 숫자 [I-lowbit (I)]을 나타내는 데 ... A는 [I]이다.

무거운 유사한 조작이 그렇게 배열 약 기록이 있기 때문에 [I]는 난 껍질이 먼저 발생 횟수마다 S가 [I] 일] 업데이트 결과를 나타냄 -;들 [ I] ++; 나는 = 1]이다.

그러나 하나 개의 섹션이 메시지 B-3, B-7 등장이 쉘의 B ... 옆도 간격 ... B-5, 및 X (A <B-7을 상정되어 있다고 생각 <B-5 <B-3 <B), 우리는 요구되는은 A ... S [B-7] 때 B - 상기 응답이 에러가 발생할 때 다음 (작은 ... B-5를 요청 잊지). (설명이 명확하지 않다, 감정적 인 이해를)

그래서 여기에 우리는 액션을 사용 - 오프라인 의이 오프라인, 일회성 문제 (문제 해결을 용이하게하기 위해) 정렬 후 원래의 순서에 따라 응답 출력을 저장하는 특정 순서에 따라, 모든 입력 소위.

어떻게 오프라인 응용 프로그램은 무엇입니까? 우리는 저장된 구성 데이터를 사용하여, 각각의 가변 구조물은 정렬 그래서, 다시 응답 출력한다 그리고, 키워드로 다시 정렬의 모든 값을 읽은 후, 키워드 번호가 이전에 따른 저장된 값, 저장된 다른 일련 번호를 가지며 그 용도가 쓰여 있습니다.

예를 들어, 질문 :

. (1)  구조체 QUES {
 2      INT의 L, R & LT, ANS, ID]
 . (3)  } Q [MAXN]
 . 4  BOOL CMP1 (QUES A, QUES B) {
 5.       아르곤 < BR]
 . 6  }
 . 7  BOOL CMP2 (QUES A, QUES B) {
 . 8      복귀 a.id는 < b.id]
 . 9  }
 10  INT 의 main () {
 . 11      // 데이터를 읽고 
12되는      정렬 (Q의 + . 1 , m + Q + 1. , CMP1) //이 먼저 정렬 패스
 (13)는      // 얻어진 응답 
(14)      정렬 (Q +를 . 1 , m + Q +. (1) , CMP2); // 번째 패스 정렬
 15      // 출력 응답 
(16)      복귀  0 ]
 . 17 }

AC 코드

1 #INCLUDE <iostream>
 2 #INCLUDE <알고리즘>
 3 #INCLUDE <cstdio>
 4  이용한  스페이스 성병;
5  CONST의  INT의 maxn = 500,005 ;
6  INT S [maxn, N, A [maxn] m;
7  INT는  이다 [maxn * 2 ];
8 인라인 INT lowbit ( INT X) {
 9      복귀 , X (- X);
10  }
 11  무효 인서트 ( INT의 ID, INT의 K) {
 12       (int로 I = ID; 난 = <N; I + = lowbit (I)) {
 13          S [I] + = K;
14      }
 15  }
 16  INT 쿼리 ( INT ID) {
 17      INT의 입술 = 0 ;
(18)      에 대한이 ( int로 , I> I = ID를 0 , I- = {lowbit (I))
 19          입술 + = S [I];
20      }
 21      리턴 입술;
22  }
 23  구조체 QUES {
 24      INT의 L, R, ANS, ID;
25  } Q [maxn];
(26) 부울 CMP1은 (a를 QUES, QUES b) {
 27      반환 AR < BR;
28  }
 29  부울 CMP2는 (a QUES, QUES b) {
 30      반환 a.id < b.id;
31  }
 32  INT 의 main () {
 33      CIN >> N;
34      INT에서 CNT = 1 ;
(35)      에 대한이 ( int로 I = 1 난 ++; i가 N = < {)
 36          (scanf와 " %의 D를 " 및하는 [I]);
37      }
 38      CIN >> m;
(39)      에 대한이 ( 값 int = 1을 1 ; 나는 <= m; 내가 ++ ) {
 40          는 scanf ( " %의 D % d에 " , Q [I] 펜닐, Q [I] .R);
(41)          Q [I] .ID = I;
42      }
 43      정렬 (Q + 1 , Q + m + 1 , CMP1);
(44)      에 대한이 ( int로 I = 1 ; i가 N = <; 내가 ++ )는 {
 45          만약 ( [A [I]) {
 46              인서트 (  [A [I]] - 1 );
(47)          }
 (48)         삽입 (I, 1 );
49           [A [I] = I;
50          하면서 (Q [CNT] == .R I && CNT <= m) {
 51              (Q) [CNT] = .ans 쿼리 (Q [CNT] .R) - 쿼리 (Q [CNT] .l- 1 );
(52)              (CNT) ++ ;
53          }
 54      }
 55      정렬 (Q + 1 , Q + m + 1 , CMP2);
(56)      에 대한이 ( 값 int = 1을 1 ; 나는 <= m; 내가 ++ ) {
 57          의 printf ( " % D \ 없음 " , Q [I] .ans);
(58)      }
 (59)     반환  0 ;
60 }

 

추천

출처www.cnblogs.com/yinyuqin/p/11110794.html