Race
#include <bits/stdc++.h> #define N 500000 using namespace std; int n; int sz; int ans[4*N+5]; struct _tuple{ int org; int v; int idx; }; _tuple A[N+5]; vector <int> tree; bool sf(_tuple a,_tuple b){ return a.org>b.org; } bool sff(_tuple a,_tuple b){ return a.idx<b.idx; } void input(){ //freopen("in.txt","r",stdin); cin>>n; for(int i=1;i<=n;i++){ cin>>A[i].org; A[i].idx=i; } sort(A+1,A+n+1,sf); A[1].v=1; for(int i=1;i<n;i++){ A[i+1].v=A[i].v+1; } sort(A+1,A+n+1,sff); } int s_t(int l, int r){ int ll=0,rr=0; while(l<=r){ if(l%2==1){ ll+=tree[l]; if(l==r){ break; } l++; } l/=2; if(r%2==0){ rr+=tree[r]; r--; } r/=2; } return rr+ll; } void pro(){ int lvl=1; while(lvl<n){ lvl*=2; } int sz=lvl+n-1; for(int i=0;i<sz;i++){ tree.push_back(0); } int idx; for( int i=1;i<=n;i++){ idx=lvl+A[i].v-1; ans[A[i].idx]=s_t(lvl,idx-1)+1; while(idx>=1){ tree[idx]+=1; idx/=2; } } for(int j=1;j<=n;j++){ cout<<ans[j]<<" "; } } int main() { input(); pro(); cout<<endl; return 0; }
+) Solution with indexed set
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; using namespace std; typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> indexed_set; int n,x; indexed_set s; int main() { scanf("%d",&n); for (int i = 0; i < n; i++) { scanf("%d", &x); cout << i - s.order_of_key(x) + 1 << "\n"; s.insert(x); } return 0; }
Comments
Post a Comment