poj 2182 树状数组

   思路很重要,能想到从后面开始算,最后一个的值加上一就是它的具体位置了。依次类推,就能得到前面的位置。

我刚开始在想,一般方法也能做出来呀,为什么要用树状数组呢。。? 效率!!树状数组可以提高效率。同样时用数组,它就要比一般的数组要快。关键还是要想到,还有就是理解树状数组。

  感谢:http://www.cnblogs.com/rainydays/archive/2011/06/04/2072849.html

前辈们铺好的路,让我们后人能走得更快。

每AC一题,那种感觉是豁然开朗的,怎一个爽字了得! 没做出一题,我的排名就上升了快1000名,呼呼  ~加油!

没有什么可以阻挡你的!

#include <iostream>
#include <cstdio>
#include <fstream>

using namespace std;

#define MAX 8008

int f[MAX];
int ar[MAX],flag[MAX];
int n;

inline int lowbit(int i){
return i&(-i);
}

void add(int i){
for(;i<=MAX ;ar[i]+=1,i+=lowbit(i));
}

int sum(int i){
int s=0;
for(;i>0 ;s+=ar[i],i-=lowbit(i));
return s;
}

int calspace(int index){
return index-sum(index);
}

int binary_search(int i){
int l=1;
int r=n;
int mid;
while(l<r){
mid=(l+r)/2;
int temp=calspace(mid);
if(temp<i) //注意这里
l=mid+1;
else
r=mid;
}
return l;
}

int main()
{
freopen("acm.in","r",stdin);
int i;
scanf("%d",&n);
for(i=1 ;i<n ;i++){
scanf("%d",&f[i]);
}
f[0]=0;
for(i=n-1 ;i>=0 ;i--){
int a=binary_search(f[i]+1);
flag[i]=a;
add(a); //把已经找到位置的添加减去。好让在它后面的找位置的时候要多加个1
}
for(i=0 ;i<n ;i++){
printf("%d\n",flag[i]);
}
return 0;
}



你可能感兴趣的:(树状数组)