我原来有没有比O(n^2)更好的方法,但一直没想到。 #include<iostream> #include<cstring> using namespace std; inline void getinput( int * a, int n) { a[0] = 0; for( int i=1; i<=n; i++) cin>> a[i]; return; } inline void dumpoutput( int *a, int n) { for( int i=1; i<n; i++) cout<<a[i]<<" "; cout<<a[n]<<endl; return; } void perm2inver( int * P , int * I, int n) { I[ P[1] ] = 0; for( int i=1; i<=n; i++) { int t = 0; for( int j = 1; j< i; j++) if( P[j] > P[i] ) t++; I[ P[i] ] = t; } return; } void inver2perm( int * P , int * I, int n) { memset( P, 0, sizeof( int) *(n+1)); for( int i =1; i<=n; i++) { int t = I[i]; int j=1; while( P[j] > 0) j++; while( t > 0) { t--, j++; while( P[j] > 0) j++; } P[j] = i; } return; } int main(void) { int n; while( cin >> n && n > 0) { char t; int *perm = new int[n+1]; int *inver = new int[n+1]; cin >> t; switch( t) { case 'P': getinput( perm, n); perm2inver( perm, inver, n); dumpoutput( inver, n); break; case 'I': getinput( inver, n); inver2perm( perm, inver, n); dumpoutput( perm, n); break; default: return 1; } delete[] perm; delete[] inver; } return 0; }