Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:第K大数,我推荐Treap

Posted by pdamirain at 2014-12-21 22:10:30 on Problem 1442
In 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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator