史上第一乱水题……
对于30%的数据,1 <= N <= 100,给出的数不大于100,均为非负整数;
对于50%的数据,1 <= N <= 10000,给出的数不大于10000,均为非负整数;
对于100%的数据,1 <= N <= 50000,给出的数在32位有符号整数范围内。
提示:
由于数据量很大,使用C++的同学请使用scanf和printf来进行输入输出操作,以免浪费不必要的时间。
#include "stdio.h" #include "stdlib.h" #include "iostream" #include "algorithm" using namespace std; inline void read(int & v){ char ch;int poi=1; while (ch=getchar(),ch!='-'&&(ch>'9'||ch<'0')); if(ch=='-') poi=-1,ch=getchar(); v=0; while (ch<='9'&&ch>='0') v=v*10+ch-'0',ch=getchar(); v*=poi; } const int N=50005; struct Node { int x,y;}s[N]; inline bool cmp0(const Node a,const Node b){ return a.x==b.x?a.y<b.y:a.x<b.x;} inline bool cmp1(const Node a,const Node b){ return a.y<b.y;} void work(){ int n,i,j;read(n); for (i=1;i<=n;i++) read(s[i].x),s[i].y=i; sort(s+1,s+n+1,cmp0); for (i=2,j=2;i<=n;i++) if(s[i].x!=s[i-1].x) s[j++]=s[i]; sort(s+1,s+j,cmp1); for (i=1;i<j-1;i++) printf("%d ",s[i].x); printf("%d\n",s[j-1].x); } int main(){ // freopen("num.in","r",stdin); // freopen("num.out","w",stdout); int T; read(T); while (T--) work(); return 0; }