首页 > 代码库 > BZOJ1208: [HNOI2004]宠物收养所
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 }
BZOJ1208: [HNOI2004]宠物收养所
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。