Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:第K大数,我推荐TreapIn Reply To:第K大数,我推荐Treap Posted by:CKboss at 2013-09-10 23:25:11 > #include <iostream> > #include <cstdio> > #include <cstdlib> > #include <cstring> > > using namespace std; > > const int maxNode=444444; > const int INF=0x3f3f3f3f; > int M,N,II,cc; > int arr[33000]; > int u[33000]; > > struct Treap > { > int root,treapCnt,key[maxNode],priority[maxNode], > childs[maxNode][2],cnt[maxNode],ssize[maxNode]; > > Treap() > { > root=0; > treapCnt=1; > priority[0]=INF; > ssize[0]=0; > } > > void update(int x) > { > ssize[x]=ssize[childs[x][0]]+cnt[x]+ssize[childs[x][1]]; > } > > void rotate(int &x,int t) > { > int y=childs[x][t]; > childs[x][t]=childs[y][1-t]; > childs[y][1-t]=x; > update(x); > update(y); > x=y; > } > > void _insert(int &x,int k) > { > if(x) > { > if(key[x]==k) > { > cnt[x]++; > } > else > { > int t=key[x]<k; > _insert(childs[x][t],k); > if(priority[childs[x][t]]<priority[x]) > { > rotate(x,t); > } > } > } > else > { > x=treapCnt++; > key[x]=k; > cnt[x]=1; > priority[x]=rand(); > childs[x][0]=childs[x][1]=0; > } > update(x); > } > > int _getKth(int &x,int k) > { > if(k<=ssize[childs[x][0]]) > { > return _getKth(childs[x][0],k); > } > k-=ssize[childs[x][0]]+cnt[x]; > if(k<=0) > { > return key[x]; > } > return _getKth(childs[x][1],k); > } > > void Insert(int k) > { > _insert(root,k); > } > > int GetKth(int k) > { > return _getKth(root,k); > } > > }T; > > int main() > { > scanf("%d%d",&M,&N); > II=0;cc=1; > for(int i=1;i<=M;i++) > { > scanf("%d",arr+i); > } > for(int i=1;i<=N;i++) > { > scanf("%d",u+i); > } > for(int i=1;i<=M;i++) > { > T.Insert(arr[i]); > while(i==u[cc]) > { > cc++;II++; > printf("%d\n",T.GetKth(II)); > } > } > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator