bzoj2761 用treap写了写

bzoj2761 用treap写了写
 1 program hehe;

 2 type

 3  shu=record

 4   l,r,w,h,y,s:longint;

 5  end;

 6 var

 7  n,i,j,k,t,ans,root,size:longint;

 8  x:array[0..100000] of shu;

 9 

10   procedure update(a:longint);

11   begin

12    x[a].s:=x[x[a].l].s+x[x[a].r].s+x[a].w;

13   end;

14 

15   procedure rturn(var a:longint);

16   var

17    t:longint;

18   begin

19    t:=x[a].l;

20    x[a].l:=x[t].r;

21    x[t].r:=a;

22    x[t].s:=x[a].s;

23    update(a);

24    a:=t;

25   end;

26 

27   procedure lturn(var a:longint);

28   var

29    t:longint;

30   begin

31    t:=x[a].r;

32    x[a].r:=x[t].l;

33    x[t].l:=a;

34    x[t].s:=x[a].s;

35    update(a);

36    a:=t;

37   end;

38 

39   procedure insert(var a:longint;b:longint);

40   begin

41    if a=0 then

42    begin

43     inc(size);

44     a:=size;

45     x[a].s:=1;

46     x[a].w:=1;

47     x[a].h:=b;

48     x[a].y:=random(maxlongint);

49     exit;

50    end;

51    inc(x[a].s);

52    if x[a].h=b then inc(x[a].w)

53    else if b>x[a].h then

54    begin

55     insert(x[a].r,b);

56     if x[x[a].r].y<x[a].y then lturn(a);

57    end

58    else

59    begin

60     insert(x[a].l,b);

61     if x[x[a].l].y<x[a].y then rturn(a);

62    end;

63   end;

64 

65   function find(a,b:longint):boolean;

66   begin

67    if a=0 then exit(false);

68    if x[a].h=b then exit(true);

69    if b>x[a].h then exit(find(x[a].r,b));

70    exit(find(x[a].l,b));

71   end;

72 

73 begin

74  readln(t);

75  for i:=1 to t do

76  begin

77   read(n);

78   root:=0;

79   size:=0;

80   fillchar(x,sizeof(x),0);

81   for j:=1 to n do

82   begin

83    read(k);

84    if not find(root,k) then

85    if j=1 then write(k)

86    else write(' ',k);

87    insert(root,k);

88   end;

89   writeln;

90  end;

91 end.
View Code

2761: [JLOI2011]不重复数字

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 2336  Solved: 895
[ 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]

你可能感兴趣的:(ZOJ)