码迷,mamicode.com
首页 > 其他好文 > 详细

SPOJ 3273

时间:2016-08-31 23:59:29      阅读:439      评论:0      收藏:0      [点我收藏+]

标签:

传送门:

 

这是一道treap的模板题,不要问我为什么一直在写模板题

 


依旧只放代码

  1 //SPOJ 3273
  2 //by Cydiater
  3 //2016.8.31
  4 #include <iostream>
  5 #include <cstring>
  6 #include <ctime>
  7 #include <cmath>
  8 #include <cstdlib>
  9 #include <string>
 10 #include <algorithm>
 11 #include <queue>
 12 #include <map>
 13 #include <iomanip>
 14 #include <cstdio>
 15 using namespace std;
 16 #define ll long long
 17 #define up(i,j,n)        for(int i=j;i<=n;i++)
 18 #define down(i,j,n)        for(int i=j;i>=n;i--)
 19 const int MAXN=1e6+5;
 20 const int oo=0x3f3f3f3f;
 21 inline int read(){
 22     char ch=getchar();int x=0,f=1;
 23     while(ch>9||ch<0){if(ch==-)f=-1;ch=getchar();}
 24     while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}
 25     return x*f;
 26 }
 27 int N,num,root=0,tol=0;
 28 char op;
 29 map<int,int>m;
 30 struct node{
 31     int rnd,v,cnt,siz,leftt,rightt;
 32 }t[MAXN];
 33 namespace solution{
 34     void updata(int k){
 35         t[k].siz=t[t[k].leftt].siz+t[t[k].rightt].siz+t[k].cnt;
 36     }
 37     void lefturn(int &k){
 38         int tt=t[k].rightt;t[k].rightt=t[tt].leftt;t[tt].leftt=k;
 39         t[tt].siz=t[k].siz;updata(k);k=tt;
 40     }
 41     void righturn(int &k){
 42         int tt=t[k].leftt;t[k].leftt=t[tt].rightt;t[tt].rightt=k;
 43         t[tt].siz=t[k].siz;updata(k);k=tt;
 44     }
 45     void insert(int &k,int x){
 46         if(k==0){
 47             k=++tol;t[k].leftt=t[k].rightt=0;
 48             t[k].cnt=1;t[k].siz=1;t[k].v=x;
 49             t[k].rnd=rand();
 50             return;
 51         }
 52         t[k].siz++;
 53         if(t[k].v==x)t[k].cnt++;
 54         else if(x>t[k].v){
 55             insert(t[k].rightt,x);
 56             if(t[t[k].rightt].rnd<t[k].rnd)lefturn(k);
 57         }else if(x<t[k].v){
 58             insert(t[k].leftt,x);
 59             if(t[t[k].leftt].rnd<t[k].rnd)righturn(k);
 60         }
 61     }
 62     void del(int &k,int x){
 63         if(k==0)    return;
 64         if(x==t[k].v){
 65             if(t[k].cnt>1){t[k].siz--;t[k].cnt--;return;}
 66             else if(t[k].leftt*t[k].rightt==0)    k=t[k].leftt+t[k].rightt;
 67             else if(t[t[k].leftt].rnd<t[t[k].rightt].rnd){
 68                 righturn(k);
 69                 del(k,x);
 70             }
 71             else if(t[t[k].leftt].rnd>t[t[k].rightt].rnd){
 72                 lefturn(k);
 73                 del(k,x);
 74             }
 75         }else if(x>t[k].v){
 76             t[k].siz--;
 77             del(t[k].rightt,x);
 78         }else if(x<t[k].v){
 79             t[k].siz--;
 80             del(t[k].leftt,x);
 81         }
 82     }
 83     int query_num(int k,int x){
 84         if(k==0)                                return oo;
 85         if(x<=t[t[k].leftt].siz)                return query_num(t[k].leftt,x);
 86         else if(x>t[t[k].leftt].siz+t[k].cnt)    return query_num(t[k].rightt,x-(t[t[k].leftt].siz+t[k].cnt));
 87         else                                    return t[k].v;
 88     }
 89     int query_siz(int k,int x){
 90         if(k==0)                                return 0;
 91         if(x<=t[k].v)                            return query_siz(t[k].leftt,x);
 92         else if(x>t[k].v)                        return t[t[k].leftt].siz+t[k].cnt+query_siz(t[k].rightt,x);
 93     }
 94     void slove(){
 95         N=read();
 96         while(N--){
 97             scanf("%c",&op);num=read();
 98             if(op==I)if(m[num]==0){insert(root,num);m[num]=1;}
 99             if(op==D)if(m[num]==1){del(root,num);m[num]=0;}
100             if(op==K){
101                 if(num>t[root].siz)puts("invalid");
102                 else{
103                     int ans=query_num(root,num);
104                     if(ans>=oo){
105                         puts("invalid");
106                         continue;
107                     }
108                     printf("%d\n",ans);
109                 }
110             }
111             if(op==C)printf("%d\n",query_siz(root,num));
112         }
113     }
114 }
115 int main(){
116     //freopen("input.in","r",stdin);
117     using namespace solution;
118     slove();
119     return 0;
120 }

 

SPOJ 3273

标签:

原文地址:http://www.cnblogs.com/Cydiater/p/5827754.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!