思路很重要,能想到从后面开始算,最后一个的值加上一就是它的具体位置了。依次类推,就能得到前面的位置。
我刚开始在想,一般方法也能做出来呀,为什么要用树状数组呢。。? 效率!!树状数组可以提高效率。同样时用数组,它就要比一般的数组要快。关键还是要想到,还有就是理解树状数组。
感谢:http://www.cnblogs.com/rainydays/archive/2011/06/04/2072849.html
前辈们铺好的路,让我们后人能走得更快。
每AC一题,那种感觉是豁然开朗的,怎一个爽字了得! 没做出一题,我的排名就上升了快1000名,呼呼 ~加油!
没有什么可以阻挡你的!
#include#include #include 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 =0 ;i--){ int a=binary_search(f[i]+1); flag[i]=a; add(a); //把已经找到位置的添加减去。好让在它后面的找位置的时候要多加个1 } for(i=0 ;i