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;
}
我是一名在校大学生,热爱编程,虽然起步晚了些,但我会努力的。呵呵!
数据结构 算法