zoukankan      html  css  js  c++  java
  • [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("
    ");
     98     }
     99     return 0;
    100 }
  • 相关阅读:
    讨论下NOSQLDB使用场景的问题
    控制反转IOC与依赖注入DI dodo
    ASp.net中Froms验证方式 dodo
    SQL Server 2008阻止保存要求重新创建表的更改 dodo
    依赖注入容器Unity介绍 dodo
    mvc UrlHelper dodo
    ASP.NET MVC 使用TempData dodo
    ASP.NET MVC的生命周期与网址路由 dodo
    强制将IE,Chrome设置为指定兼容模式来解析 dodo
    LINQ to XML 常用操作(转) dodo
  • 原文地址:https://www.cnblogs.com/CXCXCXC/p/4712182.html
Copyright © 2011-2022 走看看