bzoj2761
事实证明,数据存在负数?
用treap确实小题大做了
#include<cstdio> #include<cctype> #include<cstring> #include<cstdlib> using namespace std; int n,siz,rt,x,flag; struct data{int rnd,val,l,r;}tr[50002]; void rturn(int &k){int tmp=tr[k].l;tr[k].l=tr[tmp].r;tr[tmp].r=k;k=tmp;} void lturn(int &k){int tmp=tr[k].r;tr[k].r=tr[tmp].l;tr[tmp].l=k;k=tmp;} void read(int &x){ char ch=getchar();x=0;int f=1; while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} x*=f; } void insert(int &k,int x){ if(k==0){siz++;k=siz;tr[k].val=x;tr[k].rnd=rand();return;} if(tr[k].val==x){flag=1;return;} else if(x<tr[k].val){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(){ int T;read(T); while(T--){ memset(tr,0,sizeof tr); read(n);rt=siz=flag=0; read(x);insert(rt,x);if(!flag)printf("%d",x); for(int i=1;i<n;i++){ flag=0; read(x);insert(rt,x); if(!flag)printf(" %d",x); } printf("\n"); } }
黄学长的hash自行了解