HDU 2689 Sort it 역순 수, 트 리 배열 구현
나무 모양 의 배열 이 신기 하 다. 특히 그 lowbit () 함수 가 정말 절묘 하 다!
자신 이 본 지식 을 검증 하기 위해 서 물 문 제 를 풀 었 습 니 다. 정말 물 문 제 였 습 니 다. 역순 수 를 구 했 습 니 다. 그 전에 저 는 모두 역순 수 를 구 했 습 니 다. 저 는 0 ms 를 통 과 했 던 것 으로 기억 합 니 다.
오늘 나무 모양 의 배열 을 사 용 했 는데 도 0 ms 입 니 다.
나무 모양 의 배열 이 잘 보이 지 않 아서 더 이상 이런 말 을 하지 못 하 겠 습 니 다. 여러분 을 오도 할 까 봐 두 렵 습 니 다.정말 그의 신기 한 곳 에 충격 을 받 았 기 때문에 짧 은 십 여 줄 의 코드 만으로 도 그렇게 멋 진 일 을 완성 할 수 있 습 니 다. 정말 그만 두 고 싶 어도 그만 둘 수 없습니다!
다음은 제 견 해 를 말씀 드 리 겠 습 니 다. 나무 모양 사 이 는 하나의 함수 로 이 루어 졌 습 니 다. 그것 은 바로 lowbit () 입 니 다. 만약 에 나무 모양 의 배열 을 배 운 적 이 없다 면 그 다음 에 당신 은 놀 랄 것 입 니 다.다음은 lowbit () 의 원본 코드 입 니 다.
int lowbit(int x)
{
return x&(-x) ;
}
, ,, , , 。 , :<a target=_blank href="http://blog.csdn.net/int64ago/article/details/7429868"> </a>。
<pre name="code" class="cpp">index += lowbit(index) //
index -= lowbit(index) //
hdu:2689 Sort it 点击打开这题就是求逆序数的,关于怎么用树状数组求逆序数,且听我解释,,由于题目告知,序列中无重复数字。所以,我们可以转化一下思路,逆序数是指这个数它后面有多少个数比它小的,可以等价为求这个数前面有多少比他大的就行了,由于求比他大的太浪费时间,,所以求比他的小的数量,在转化一下就可以了,具体转化:index-sum(index);其中index为为这个数在序列中位置,sum(index)是指index前面比他小的数的数目之和。
代码:
#include <stdio.h> #include <string.h> #define MAX 1005 int a[MAX] ; int lowbit(int x) { return x&(-x) ; } void update(int pos) { while(pos <= MAX) { a[pos]++ ; pos += lowbit(pos); } } int sum(int pos) { int s = 0 ; while(pos > 0) { s += a[pos] ; pos -= lowbit(pos) ; } return s ; } int main() { int n ; while(~scanf("%d",&n)) { memset(a,0,sizeof(int)*MAX); int pos , s = 0; for(int i = 0 ; i < n ; ++i) { scanf("%d",&pos); update(pos); int t = sum(pos-1) ; s += i-t; } printf("%d
",s); } return 0 ; }
모 르 는 것 이 있 으 면 클릭: 클릭 하여 링크 열기
또는: 클릭 하여 링크 열기
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.