题目传送门
这题就是去重,因为数字太大不能使用基数排序。
所以,我们可以使用快排,在排序的同时记录开始读入的时候的序号,最后去完重复之后用这个序号还原原来的序列。
(又是dalao提供的水题)
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=a;i>=n;i--)
#define Clear(a,x) memset(a,x,sizeof(a))
#define ll long long
#define INF 100000000000
#define eps 1e-8
using namespace std;
ll read(){
ll x=0,f=1;
char ch=getchar();
while (ch<'0'||ch>'9') f=ch=='-'?-1:f,ch=getchar();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int maxn=50005;
struct node{
int key,id;
}a[maxn],b[maxn];
ll rank[maxn];
int n,len;
bool cmp(node a,node b){
if (a.key==b.key) return a.id<b.id;
else return a.key<b.key;
}
int main(){
int T=read();
while (T--){
n=read();
rep(i,1,n){
a[i].key=read();
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
len=0;
rep(i,1,n)
if (a[i].key!=a[i-1].key||i==1) b[++len]=a[i];
rep(i,1,n) rank[i]=INF;
rep(i,1,len)
rank[b[i].id]=b[i].key;
int en=n;
while (rank[en]==INF) en--;
rep(i,1,en-1)
if (rank[i]!=INF) printf("%d ",rank[i]);
printf("%d\n",rank[en]);
}
return 0;
}
注意尾行空格。
注意尾行空格。
注意尾行空格。