感想:今天很开心,学到了树状数组,维护和求和都是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]; }