Description
N (2 <= N <= 8,000) cows have unique brands in the range 1..N. In a spectacular display of poor judgment, they visited the neighborhood 'watering hole' and drank a few too many beers before dinner. When it was time to line up for their evening meal, they did not line up in the required ascending numerical order of their brands.Input
* Line 1: A single integer, NOutput
* Lines 1..N: Each of the N lines of output tells the brand of a cow in line. Line #1 of the output tells the brand of the first cow in line; line 2 tells the brand of the second cow; and so on.Sample Input
5 1 2 1 0
Sample Output
2 4 5 3 1
給出n和每個數之前比它小的數有幾個 需要輸出原序列
最後一個數的真實值為a[N]+1
將a[N]+1在序列中刪去,更新a[i],那麼第N-1個數的真實值為a[N-1]+1
二分找需要刪的值
#include#include #include using namespace std; int bit[8888],ans[8888]; int a[8888],n; int lowbit(int x){ return x&(-x); } int getsum(int x){ int cnt=0; while(x>0){ cnt+=bit[x]; x-=lowbit(x); } return cnt; } void add(int x,int a){ while(x<8888){ bit[x]+=a; x+=lowbit(x); } } int bin_find(int x){ int l=1,r=n,m; while(l<=r){ m=(l+r)>>1; int k=getsum(m); if(k>=x) r=m-1; else l=m+1; } while(getsum(m) =1;i--){ ans[i]=bin_find(a[i]+1); add(ans[i],-1); } for(int i=1;i<=n;i++) printf("%d\n",ans[i]); } return 0; }