「BZOJ2761」[JLOI2011] 不重复数字
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
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
1 2 3 4 5 6
HINT
对于30%的数据,1 <= N <= 100,给出的数不大于100,均为非负整数;
对于50%的数据,1 <= N <= 10000,给出的数不大于10000,均为非负整数;
对于100%的数据,1 <= N <= 50000,给出的数在32位有符号整数范围内。
2014.2.18
我会说sort就没了么。。。
好吧用来练习平衡树
2014.11.7
我发现我基本不会写字符串哈希。。。练习一下
treap
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> using namespace std; int T,n,f; int size,root; struct data{int l,r,v,rnd;}tr[50001]; void rturn(int &k){int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k;k=t;} void lturn(int &k){int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k;k=t;} void insert(int &k,int x) { 	if(k==0){size++;k=size;tr[k].v=x;tr[k].rnd=rand();return;} 	if(tr[k].v==x){f=1;return;} 	else if(x<tr[k].v){insert(tr[k].l,x);if(tr[tr[k].l].rnd<tr[k].rnd)rturn(k);} 	else {insert(tr[k].r,x);if(tr[tr[k].r].rnd<tr[k].rnd)lturn(k);} } int main() { 	scanf("%d",&T); 	while(T--) 	{ 		memset(tr,0,sizeof(tr)); 		root=size=0;int x; 		scanf("%d%d",&n,&x);         f=0;insert(root,x);         if(!f)printf("%d",x); 		for(int i=1;i<n;i++) 		{ 			scanf("%d",&x);f=0; 			insert(root,x); 			if(!f)printf(" %d",x); 		} 		printf("\n"); 	} 	return 0; } | 
hash
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | #include<iostream> #include<cstring> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #define mod 58631 #define ll long long  using namespace std; int read() {     int x=0,f=1;char ch=getchar();     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}     return x*f; } int T,n,cnt; int last[58632],ans[50005]; struct data{int val,next;}a[50005]; void insert(int x,int val) { 	cnt++; 	a[cnt].next=last[x]; 	last[x]=cnt; 	a[cnt].val=val; } bool add(int x) { 	int sum=0,t=x; 	if(t<0)t=-t; 	while(t) 	{ 		sum=(sum+(t%10))*(t%10)%mod; 		t/=10; 	} 	for(int i=last[sum];i;i=a[i].next) 		if(a[i].val==x)return 0; 	insert(sum,x); 	return 1; } int main() { 	T=read(); 	while(T--) 	{ 		memset(last,0,sizeof(last)); 		cnt=0;ans[0]=0; 		n=read(); 		for(int i=1;i<=n;i++) 		{ 			int x=read(); 			if(add(x))ans[++ans[0]]=x; 		} 		for(int i=1;i<ans[0];i++) 			printf("%d ",ans[i]); 		printf("%d\n",ans[ans[0]]); 	} 	return 0; } | 
 
			
黄学长,请问sort做法是什么。。。
请问大神,您的 bzoj3224普通平衡树 程序中使用了C++的引用,请问root的值是否被改变?
删除时是会改变的