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;
}



转载于:https://www.cnblogs.com/Jason-Damon/archive/2012/03/07/2384468.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值