BZOJ1208: [HNOI2004]宠物收养所

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ1208: [HNOI2004]宠物收养所相关的知识,希望对你有一定的参考价值。

传送门

好奇怪的一道题..

说实话敲到最后没看懂题..WA了后仔细的读了读还是读不懂,然后去参考别人的实现...

这题真有意思(呵呵,完全为了避免说是裸题硬凑题面

 

懒得写splay版了,就放个treap的代码

技术分享
  1 //BOZJ 1208
  2 //by Cydiater
  3 //2016.9.11
  4 #include <iostream>
  5 #include <cstdio>
  6 #include <cstring>
  7 #include <string>
  8 #include <algorithm>
  9 #include <queue>
 10 #include <map>
 11 #include <ctime>
 12 #include <cmath>
 13 #include <iomanip>
 14 #include <cstdlib>
 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 const int mod=1e6;
 22 inline int read(){
 23     char ch=getchar();int x=0,f=1;
 24     while(ch>9||ch<0){if(ch==-)f=-1;ch=getchar();}
 25     while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}
 26     return x*f;
 27 }
 28 int N,tol=0,root=0,ans=0,op,num,maxx,minn,cnt=0;
 29 struct Treap{
 30     int leftt,rightt,cnt,siz,v,rnd;
 31 }t[MAXN];
 32 namespace solution{
 33     void updata(int k){t[k].siz=t[k].cnt+t[t[k].leftt].siz+t[t[k].rightt].siz;}
 34     void lefturn(int &k){
 35         int tt=t[k].rightt;t[k].rightt=t[tt].leftt;t[tt].leftt=k;
 36         t[tt].siz=t[k].siz;updata(k);k=tt;
 37     }
 38     void righturn(int &k){
 39         int tt=t[k].leftt;t[k].leftt=t[tt].rightt;t[tt].rightt=k;
 40         t[tt].siz=t[k].siz;updata(k);k=tt;
 41     }
 42     void insert(int &k,int x){
 43         if(k==0){
 44             k=++tol;t[k].leftt=t[k].rightt=0;
 45             t[k].v=x;t[k].cnt=t[k].siz=1;t[k].rnd=rand();
 46             return;
 47         }
 48         t[k].siz++;
 49         if(t[k].v==x){
 50             t[k].cnt++;
 51             return;
 52         }
 53         if(x<t[k].v){
 54             insert(t[k].leftt,x);
 55             if(t[t[k].leftt].rnd<t[k].rnd)       righturn(k);
 56         }else{
 57             insert(t[k].rightt,x);
 58             if(t[t[k].rightt].rnd<t[k].rnd)      lefturn(k);
 59         }
 60     }
 61     void del(int &k,int x){
 62         if(k==0)        return;
 63         if(t[k].v==x){
 64             if(t[k].cnt>1){
 65                 t[k].siz--;t[k].cnt--;
 66                 return;
 67             }
 68             if(t[k].leftt*t[k].rightt==0)k=t[k].leftt+t[k].rightt;
 69             else if(t[t[k].leftt].rnd<t[t[k].rightt].rnd){
 70                 righturn(k);
 71                 del(k,x);
 72             }else{
 73                 lefturn(k);
 74                 del(k,x);
 75             }
 76         }
 77         else if(x<t[k].v){
 78             t[k].siz--;
 79             del(t[k].leftt,x);
 80         }else{
 81             t[k].siz--;
 82             del(t[k].rightt,x);
 83         }
 84     }
 85     void pre(int k,int x){
 86         if(k==0)        return;
 87         if(t[k].v<=x){
 88             minn=k;
 89             pre(t[k].rightt,x);
 90             return;
 91         }
 92         if(t[k].v>x)pre(t[k].leftt,x);
 93     }
 94     void nxt(int k,int x){
 95         if(k==0)        return;
 96         if(t[k].v>=x){
 97             maxx=k;
 98             nxt(t[k].leftt,x);
 99             return;
100         }
101         if(t[k].v<x)nxt(t[k].rightt,x);
102     }
103     void slove(){
104         N=read();
105         while(N--){
106             op=read();num=read();
107             if(!cnt){
108                 if(op){cnt--;insert(root,num);}
109                 else  {cnt++;insert(root,num);}
110             }else if(cnt>0){
111                 if(op){
112                     cnt--;maxx=-1;minn=-1;
113                     pre(root,num);nxt(root,num);
114                     if(maxx==-1&&minn==-1)continue;
115                     if(maxx==-1){
116                         ans+=num-t[minn].v;
117                         ans%=mod;
118                         del(root,t[minn].v);
119                         continue;
120                     }
121                     if(minn==-1){
122                         ans+=t[maxx].v-num;
123                         ans%=mod;
124                         del(root,t[maxx].v);
125                         continue;
126                     }
127                     if(num-t[minn].v<=t[maxx].v-num){
128                         ans+=num-t[minn].v;
129                         ans%=mod;
130                         del(root,t[minn].v);
131                     }else{
132                         ans+=t[maxx].v-num;
133                         ans%=mod;
134                         del(root,t[maxx].v);
135                     }
136                 }else{
137                     cnt++;
138                     insert(root,num);
139                 }
140             }
141             else{
142                 if(op){
143                     cnt--;
144                     insert(root,num);                   
145                 }else{
146                     cnt++;maxx=-1;minn=-1;
147                     pre(root,num);nxt(root,num);
148                     if(maxx==-1&&minn==-1)continue;
149                     if(maxx==-1){
150                         ans+=num-t[minn].v;
151                         ans%=mod;
152                         del(root,t[minn].v);
153                         continue;
154                     }
155                     if(minn==-1){
156                         ans+=t[maxx].v-num;
157                         ans%=mod;
158                         del(root,t[maxx].v);
159                         continue;
160                     }
161                     if(num-t[minn].v<=t[maxx].v-num){
162                         ans+=num-t[minn].v;
163                         ans%=mod;
164                         del(root,t[minn].v);
165                     }else{
166                         ans+=t[maxx].v-num;
167                         ans%=mod;
168                         del(root,t[maxx].v);
169                     }
170                 }
171             }
172         }
173     }
174     void output(){
175         cout<<ans<<endl;
176     }
177 }
178 int main(){
179     //freopen("input.in","r",stdin);
180     using namespace solution;
181     slove();
182     output();
183     return 0;
184 }
View Code

 

以上是关于BZOJ1208: [HNOI2004]宠物收养所的主要内容,如果未能解决你的问题,请参考以下文章

bzoj 1208: [HNOI2004]宠物收养所

BZOJ 1208: [HNOI2004]宠物收养所

BZOJ 1208: [HNOI2004]宠物收养所

bzoj1208: [HNOI2004]宠物收养所

bzoj 1208: [HNOI2004]宠物收养所 set

bzoj:1208: [HNOI2004]宠物收养所