According to Wikipedia: "In mathematics and in particular in combinatorics, the Lehmer code is a particular way to encode each possible permutation of a sequence of n numbers." To be more specific, for a given permutation of items {A?1??, A?2??, ?, A?n??}, Lehmer code is a sequence of numbers {L?1??, L?2??, ?, L?n??} such that L?i?? is the total number of items from A?i?? to A?n?? which are less than A?i??. For example, given { 24, 35, 12, 1, 56, 23 }, the second Lehmer code L?2?? is 3 since from 35 to 23 there are three items, { 12, 1, 23 }, less than the second item, 35.
Each input file contains one test case. For each case, the first line gives a positive integer N (≤). Then N distinct numbers are given in the next line.
For each test case, output in a line the corresponding Lehmer code. The numbers must be separated by exactly one space, and there must be no extra space at the beginning or the end of the line.
6
24 35 12 1 56 23
3 3 1 0 1 0
1 #include<bits/stdc++.h> 2 #include<ext/pb_ds/assoc_container.hpp> 3 #include<ext/pb_ds/tree_policy.hpp> 4 using namespace __gnu_pbds; 5 using namespace std; 6 int main() 7 { 8 // freopen("data.txt","r",stdin); 9 int n,x,c1,c2; 10 tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> tr; 11 scanf("%d",&n); 12 vector<int> v(n); 13 for(int i=0;i<n;i++) 14 scanf("%d",&v[i]); 15 for(int i=n-1;i>-1;i--) 16 { 17 tr.insert(v[i]); 18 v[i]=tr.order_of_key(v[i]); 19 } 20 printf("%d",v[0]); 21 for(int i=1;i<n;++i) 22 printf(" %d",v[i]); 23 return 0; 24 }
原文:https://www.cnblogs.com/SkystarX/p/12285803.html