[JLOI2011]不重复数字

2761: [JLOI2011]不重复数字

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 2459  Solved: 939
[Submit][Status][Discuss]

Description

给出N个数,要求把其中重复的去掉,只保留第一次出现的数。
例如,给出的数为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 18 3 19 6 5 4。
 

Input

输入第一行为正整数T,表示有T组数据。
接下来每组数据包括两行,第一行为正整数N,表示有N个数。第二行为要去重的N个正整数。
 

Output

 
对于每组数据,输出一行,为去重后剩下的数字,数字之间用一个空格隔开。

Sample Input

2
11
1 2 18 3 3 19 2 3 6 5 4
6
1 2 3 4 5 6

Sample Output

1 2 18 3 19 6 5 4
1 2 3 4 5 6

HINT

 

对于30%的数据,1 <= N <= 100,给出的数不大于100,均为非负整数;


对于50%的数据,1 <= N <= 10000,给出的数不大于10000,均为非负整数;


对于100%的数据,1 <= N <= 50000,给出的数在32位有符号整数范围内。


提示:


由于数据量很大,使用C++的同学请使用scanf和printf来进行输入输出操作,以免浪费不必要的时间。


 

 

Source

                   [Submit][Status][Discuss]
 
  本来是个平衡树,但是可以用STL中的set来作,具体set有讲解:
  http://blog.csdn.net/lyhvoyage/article/details/22989659
  今天第一次见识了PE,PE与AC的区别是格式的问题,如多了一个空格什么的。。。。
 1 #include<bits/stdc++.h> 
 2 using namespace std;
 3 set<int>S;
 4 int T,n,x,a[50001],b[50001],end;
 5 int main()
 6 {    
 7     scanf("%d",&T);
 8     for(;T;T--) {    
 9         scanf("%d",&n); 
10         S.clear(); end=0;    
11         for(int i=1;i<=n;i++) 
12             scanf("%d",&a[i]);
13         for(int i=1;i<=n;i++)
14             if(S.find(a[i])==S.end()){//不存在该元素 
15                 S.insert(a[i]);
16                 b[++end]=a[i];
17             }
18         for(int i=1;i<end;i++) 
19             printf("%d",b[i]),cout<<" ";
20         cout<<b[end]<<endl;
21     }
22     return 0; 
23 }

   再来一发SBT的(PE)。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstdlib>
  4 #include<algorithm>
  5 #include<cmath>
  6 #include<cstring>
  7 #include<queue>
  8 #include<vector>
  9 using namespace std;
 10 typedef long long LL; 
 11 const LL maxn=500100;
 12 LL key[maxn],siz[maxn],lc[maxn],rc[maxn];
 13 LL root,tot;
 14 LL T,N;
 15 void r_rotate(LL &rt){
 16     LL k=lc[rt];
 17     lc[rt]=rc[k];
 18     rc[k]=rt;
 19     siz[k]=siz[rt];
 20     siz[rt]=siz[lc[rt]]+siz[rc[rt]]+1;
 21     rt=k;
 22 }
 23 void l_rotate(LL &rt){
 24     LL k=rc[rt];
 25     rc[rt]=lc[k];
 26     lc[k]=rt;
 27     siz[k]=siz[rt];
 28     siz[rt]=siz[lc[rt]]+siz[rc[rt]]+1;
 29     rt=k;
 30 }
 31 void Maintain(LL &rt,bool flag){
 32     if(flag==false){
 33         if(siz[lc[lc[rt]]]>siz[rc[rt]]) r_rotate(rt);
 34         else if(siz[rc[lc[rt]]]>siz[rc[rt]]){
 35             l_rotate(lc[rt]);
 36             r_rotate(rt);
 37         }
 38         else return ;
 39     }
 40     else{
 41         if(siz[rc[rc[rt]]]>siz[lc[rt]]) l_rotate(rt);
 42         else if(siz[lc[rc[rt]]]>siz[lc[rt]]){
 43             r_rotate(rc[rt]);
 44             l_rotate(rt);
 45         }
 46         else return ;
 47     }
 48     Maintain(lc[rt],false); Maintain(rc[rt],true);
 49     Maintain(rt,false); Maintain(rt,true);
 50 }
 51 void insert(LL &rt,LL v){
 52     if(rt==0){
 53         rt=++tot;
 54         key[rt]=v;
 55         siz[rt]=1; lc[rt]=rc[rt]=0;
 56         return ;
 57     }
 58     siz[rt]++;
 59     if(v<=key[rt]) insert(lc[rt],v);
 60     else insert(rc[rt],v);
 61     Maintain(rt,false); Maintain(rt,true);
 62 }
 63 LL Delete(LL &rt,LL v){
 64     LL ans;
 65     siz[rt]--;
 66     if(v==key[rt]||(v<key[rt]&&lc[rt]==0)||(v>key[rt]&&rc[rt]==0)){
 67         ans=key[rt];
 68         if(lc[rt]==0||rc[rt]==0) rt=lc[rt]+rc[rt];
 69         else key[rt]=Delete(lc[rt],key[rt]+1);
 70         return ans;
 71     }
 72     if(v<key[rt]) ans=Delete(lc[rt],v);
 73     else ans=Delete(rc[rt],v);
 74     return ans;
 75 }
 76 bool find(LL &rt,LL v){
 77     if(rt==0) return false;
 78     if(v==key[rt]) return true;
 79     if(v<key[rt]) return find(lc[rt],v);
 80     if(v>key[rt]) return find(rc[rt],v);
 81 }
 82 int main(){
 83     scanf("%lld",&T);
 84     while(T--){
 85         memset(siz,0,sizeof(siz)); memset(key,0,sizeof(key));
 86         memset(lc,0,sizeof(lc)); memset(rc,0,sizeof(rc));
 87         tot=root=0;
 88         scanf("%lld",&N);
 89         for(LL i=1,tmp;i<=N-1;i++){
 90             scanf("%lld",&tmp);
 91             if(find(root,tmp)==true) continue;
 92             else{
 93                 insert(root,tmp);
 94                 printf("%lld ",tmp);
 95             }
 96         }
 97         printf("\n");
 98     }
 99     return 0;
100 }

 

posted @ 2015-08-07 22:21  CXCXCXC  阅读(233)  评论(0编辑  收藏  举报