我的方法860ms
对原序列离散化, DY[i] 代表离散化的值i对应的原数
for 一遍原序列,二分找它的离散化值,这是就可以用bool数组了
注意有负数
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[60000],b[60000];
int DY[60000],k;
bool v[60000];
int find_( int x )
{
int st,ed,middle;
st=1; ed=k;
while( st<ed )
{
middle = (st+ed)/2;
if( x == DY[middle] )return middle;
if( ed-st == 1 )return ed;
if( x < DY[middle] )
ed = middle;
else st = middle;
}
}
int main()
{
int i,j,n,m,l;
scanf("%d",&m);
while( m-- )
{
memset( v,true,sizeof v );
memset( b,0,sizeof b );
memset( DY,0,sizeof DY );
scanf("%d",&n);
for( i=1;i<=n;i++ )
{
scanf("%d",&a[i]);
b[i] = a[i];
}
sort( b+1,b+n+1 );
DY[1] = b[1];k=1;
for( i=2;i<=n;i++ )
if( b[i] > b[i-1] )
DY[ ++k ] = b[i];
l = find_( a[1] );
v[ l ] = false;
printf( "%d",a[1] );
for( i=2;i<=n;i++ )
{
l = find_( a[i] );
if( v[l] )
{
v[l] = false;
printf( " %d",a[i] );
}
}
printf("\n");
}
return 0;
}