感想:今天很开心,学到了树状数组,维护和求和都是O(NlogN)哦!
参见:http://blog.csdn.net/int64ago/article/details/7429868
附上代码:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string>
#include<stack>
#include<map>
#include<vector>
#include<deque>
#include<cmath>
using namespace std;
int c[100002];
struct number{
int node;
int num;
};
bool com1(number &a,number &b){
return a.num<b.num;
}
void insert(int i){
while(i<100002){
c[i]++;
i+=i&-i;
}
}
int read(int i){
int sum=0;
while(i){
sum+=c[i];
i-=i&-i;
}
return sum-1;
}
int main(){
int N,i;cin>>N;
number *a=new number[N];
int *b=new int[N];
for(i=0;i<N;i++){
cin>>a[i].num;
a[i].node=i;
}
sort(a,a+N,com1);
for(i=0;i<N;i++){
b[a[i].node]=i+2;
}
for(i=0;i<N;i++){
insert(b[N-1-i]);
b[N-i-1]=read(b[N-i-1]);
}
cout<<b[0];
for(i=1;i<N;i++)
cout<<" "<<b[i];
}