p1440.cpp

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· C++ 代码 · 共 67 行

CPP
67
字号
#include <stdio.h>
#include <algorithm>

using   namespace std;

unsigned int  Ni;
int     N;
int     Data [100000] , Code [100000] , tmp [100000] , Sort [100000];


void    GB_Sort ( int left , int right )
{
        if ( left == right ) return;

        int     mid = ( left + right ) >> 1;
        int     i = left , j = mid + 1 , len = 0;
        GB_Sort ( left , mid );
        GB_Sort ( mid + 1 , right );

        while ( i <= mid && j <= right )
                if ( Sort [i] < Sort [j] ) tmp [len ++] = Sort [i ++];
                        else tmp [len ++] = Sort [j ++] , Ni += mid - i + 1;

        while ( i <= mid ) tmp [len ++] = Sort [i ++];
        while ( j <= right ) tmp [len ++] = Sort [j ++];

        memcpy ( Sort + left , tmp , len << 2 );
}

bool    cmp ( const int & a , const int & b )
{
        return Data [a] < Data [b];
}

main ()
{
//        freopen ( "p.in" , "r" , stdin );

        int     i , j , k;
        int     Num;
        Ni = 0;
        scanf ( "%d" , &N );
        for ( i = 0; i < N; i ++ ) scanf ( "%d" , &Data [i] ) , Sort [i] = Data [i];
        GB_Sort ( 0 , N - 1 );

        int     low , high , mid , key;
        for ( i = 0; i < N; i ++ ) {
                low = 0 , high = N , key = Data [i];
                while ( low + 1 < high ) {
                        mid = ( low + high ) >> 1;
                        if ( Sort [mid] <= key ) low = mid;
                                else high = mid;
                }
                Code [i] = low;
        }

        Num = 0;
        for ( i = 0; i < N; i ++ ) if ( Code [i] >= 0 ) {
                Num ++;
                for ( j = i; Code [j] >= 0; j = k )
                        k = Code [j] , Code [j] = -1;
        }

        printf ( "%d\n%u\n" , N - Num , Ni );
//        system ( "pause" );
}
 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?