교환의 수 버블 정렬 (펜윅 나무)

교환 거품 정렬의 수를 계산 :

역수의 개념 : 하나 개의 구성에서, 크기의 역순으로 번호의 한 쌍의 길이 방향 위치, 즉 후자 앞의 수보다 큰 수들은 다음 역방향이라한다면

모든 역 배열이 역순으로이 번호라고합니다 총. 역순으로 0에서 모든 숫자의 말은 그래서 거품 정렬

아이디어 :

폭력 : 발생한 어떤 i 번째의 비트 값을 순회하면서 우리는 힘 [] 배열 레코드를 열 수있다. 이어서 [I] 도착 (i 번째 비트의 값)을 이송, 수 ARR 미만 줄 것으로 보인다 [I] (즉, 숫자 I <J && 도착 [I] <= 도착 [J])의

그때 히트 조건 ARR의 카운트를 얻기 위해 감산 현재 길이를 사용하여 [I]는 역의 수이다.

최적화 : 각 요소가 편곡 이하로 표시하기 때문에 [i]를 통과, 우리는 (그래서 당신은 항상 요청을 통과 할 시간을 갖지 않는) [i]는 조건의 수에 출석 편곡 기록 배열을 열 수 있도록 노력하겠습니다

그리고 단일 지점 업데이트 간격을 추구하고, 우리는 펜윅 트리 데이터 구조를 할 수 있습니다. 따라서, 펜윅 나무의 사용을 최적화 할 수 있습니다. 

작업 :

각 종의 열 번호가 역수의 합이 얻어진다
A는 [I는 A [I]를 통과 ] 다음 비트 [I] 더하기 해당 값
레코드는 각각의 경우, 주파수 전의 값 자체 미만 자체가 나타나는
이송시 J 전방 번호 J, 즉 함께 [J] 자체 일에 '비트 [J] 갖는다 수보다
J의 역수 - 비트 [J]를

// 교류 계산 거품 정렬의 수 :
 // 역수 개념 버블 정렬, 즉 끝이 번호 0을 모두 역방향이다
 @ 아이디어 : 합산 역순 모든 숫자 열의 수를 구하는 종 번호
 // A [I 이송 ], A [i]를 다음의 비트 [I] 더하기 해당 값
 //는 각 값보다 발생하기 전에 그 자체를 기록들이 발생
 // A [j는 즉 미만 통과을 종래 숫자 J] J를 가지고 그들의 비트 [J]는 수있다
 @의 역방향 J의 수 - 비트 [J] 
#INCLUDE <비트 / STDC ++ H.> #DEFINE 아이폰 OS :: sync_with_stdio 아이폰 OS (0) cin.tie (0)
 #DEFINE MP make_pair
 #define한다 0 수락
 은 USING 스페이스 ; STD 
의 typedef LL, 
타입 정의 부호 ULL를, 
타입 정의 쌍 < INT , INT
   > PII;
CONST  이중 파이 ACOS = (- 1.0 );
CONST  이중 ESP 1e- = 9 ;
CONST  INT INF = 0x3f3f3f3f ;
CONST의  INT maxn 1E5 + = 7 ;
CONST  INT의 MAXM 1E6 + = 7 ;
CONST  INT 개조 1E9 + = 7 ;
CONST  INT MAXL 1E6 + = 7 ; 

INT의 N;
INT는 [maxn] 비트;
INT [maxn] 도착;
INT 힘 [maxn]; 
//0이 될 때까지 진 하나의 최하위 비트가 제거되는 초기 I에서 그 합계
 // i 및 종래 상품 
INT의 합 ( int로 Ⅰ) {
     INT의 S = 0 ;
     그동안 (ⅰ> 0 ) { 
        S + = '비트 [I]는,  - = 난 및 - 난; 
    } 
    리턴 S; 
} 
// 새로운 단일 포인트에서, i 번째 비트 X 증가에인가되는 전력에 대응하는 최소의 비 - 제로 전력 
무효화 추가는 ( int로 난을 INT X) {
     // '비트 [I]가 = X가, 단일 지점을 수정
     // I가 = I는 + -i, 
    그동안 (I <= N-) { 
        '비트 [I] + = X; 
        I+ = I & - 난; 
    } 
} 
보이드가 ) (해결 {
     INT ANS = 0 ;
     ( INT의 J = 0 , N J <; J ++ ) { 
        ANS + J = - 합 (도착 [J]); 
        추가 ([J] 도착을, 1 ); 
    } 
//暴力的解法
// 용 INT (I = 0; I <N은, 내가 ++) { // INT CNT = 0; // 대 (INT의 J = 0; J <도착 [I] J ++) { // 경우 (힘 [J]) CNT ++; // } // ANS + = 전 - CNT; // 힘 [도착 [I] = 1; // } 의 printf ( " % D \ 없음 " , ANS); } INT 의 main () { memset 함수 (힘, 0 , 는 sizeof (힘)); scanf와 ( " %의 D ' , N); 위한 ( int로 I = 0 내가 ++; i가 N < {) (scanf와를 " 가 % d " , 도착 [I]); } ) (해결; 반환 0 ; }

추천

출처www.cnblogs.com/Tianwell/p/11490987.html