链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2761
思路: map标记
实现代码:
#includeusing namespace std;map mp;int main(){ int t,n,x; scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i = 1;i <= n;i ++){ scanf("%d",&x); mp[x]++; if(mp[x]==1) printf("%d ",x); } printf("\n"); mp.clear(); }}
这道题也可以用平衡树写,虽然也很水/
Treap写法:
实现代码:
#includeusing namespace std;const int M = 1e5 +10;struct node{ int l,r,siz,cnt,wt,val;}t[M];int cnt,flag;void lt(int &k){ int tmp = t[k].r; t[k].r = t[tmp].l; t[tmp].l = k; t[tmp].siz = t[k].siz; t[k].siz = t[t[k].l].siz + t[t[k].r].siz + t[k].cnt; k = tmp;}void rt(int &k){ int tmp = t[k].l; t[k].l = t[tmp].r; t[tmp].r = k; t[tmp].siz = t[k].siz; t[k].siz = t[t[k].l].siz + t[t[k].r].siz + t[k].cnt; k = tmp;}void Insert(int &k,int num){ if(!k){ k = ++cnt; t[k].wt = rand(); t[k].val = num; t[k].cnt = t[k].siz = 1; return ; } ++t[k].siz; if(num == t[k].val){ ++t[k].cnt; flag = 1; return ; } if(num < t[k].val){ Insert(t[k].l,num); if(t[t[k].l].wt < t[k].wt) rt(k); } else{ Insert(t[k].r,num); if(t[t[k].r].wt < t[k].wt) lt(k); }}int main(){ int T,n,x,root; scanf("%d",&T); while(T--){ memset(t,0,sizeof(t)); root = cnt = 0; scanf("%d",&n); for(int i = 1;i <= n;i ++){ cin>>x; flag = 0; Insert(root,x); if(!flag) printf("%d ",x); } printf("\n"); } return 0;}