BZOJ 1208 宠物收养所

Posted on 2016-02-15 17:05  ziliuziliu  阅读(145)  评论(0编辑  收藏  举报

random_fuck_bzoj.!!!!!!!!

脑袋一抽建了两棵普通的treap。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define maxn 100005
#define mod 1000000
using namespace std;
int type,x,q;
int lsa[maxn],rsa[maxn],lsb[maxn],rsb[maxn],valuea[maxn],valueb[maxn],cnta=0,cntb=0;
int ans=0,roota=0,rootb=0,tota=0,totb=0,fixa[maxn],fixb[maxn],prea=0,preb=0,suba=0,subb=0;
int random_fuck_bzoj();
void clear_()
{
prea=0;preb=0;suba=0;subb=0;
}
void lturn_a(int &k)
{
int t=rsa[k];rsa[k]=lsa[t];
lsa[t]=k;k=t;
}
void rturn_a(int &k)
{
int t=lsa[k];lsa[k]=rsa[t];
rsa[t]=k;k=t;
}
void insert_a(int &k,int x)
{
if (k==0)
{
k=++tota;
lsa[tota]=0;rsa[tota]=0;
valuea[tota]=x;
fixa[tota]=random_fuck_bzoj();
return;
}
else
{
if (x>valuea[k])
{
insert_a(rsa[k],x);
if (fixa[k]>fixa[rsa[k]]) lturn_a(k);
}
else
{
insert_a(lsa[k],x);
if (fixa[k]>fixa[lsa[k]]) rturn_a(k);
}
}
}
void delete_a(int &k,int x)
{
if (k==0) return;
if (valuea[k]==x)
{
if (lsa[k]*rsa[k]==0) k=lsa[k]+rsa[k];
else
{
if (fixa[lsa[k]]<fixa[rsa[k]])
{
rturn_a(k);
delete_a(k,x);
}
else
{
lturn_a(k);
delete_a(k,x);
}
}
}
else
{
if (x>valuea[k]) delete_a(rsa[k],x);
else delete_a(lsa[k],x);
}
}
void pre_a(int k,int x)
{
if (k==0) return;
if (valuea[k]<x)
{
prea=valuea[k];
pre_a(rsa[k],x);
}
else pre_a(lsa[k],x);
}
void sub_a(int k,int x)
{
if (k==0) return;
if (valuea[k]>x)
{
suba=valuea[k];
sub_a(lsa[k],x);
}
else sub_a(rsa[k],x);
}
void lturn_b(int &k)
{
int t=rsb[k];rsb[k]=lsb[t];
lsb[t]=k;k=t;
}
void rturn_b(int &k)
{
int t=lsb[k];lsb[k]=rsb[t];
rsb[t]=k;k=t;
}
void insert_b(int &k,int x)
{
if (k==0)
{
k=++totb;
lsb[totb]=0;rsb[totb]=0;
valueb[totb]=x;
fixb[totb]=random_fuck_bzoj();
return;
}
else
{
if (x>valueb[k])
{
insert_b(rsb[k],x);
if (fixb[k]>fixb[rsb[k]]) lturn_b(k);
}
else
{
insert_b(lsb[k],x);
if (fixb[k]>fixb[lsb[k]]) rturn_b(k);
}
}
}
void delete_b(int &k,int x)
{
if (k==0) return;
if (valueb[k]==x)
{
if (lsb[k]*rsb[k]==0) k=lsb[k]+rsb[k];
else
{
if (fixb[lsb[k]]<fixb[rsb[k]])
{
rturn_b(k);
delete_b(k,x);
}
else
{
lturn_b(k);
delete_b(k,x);
}
}
}
else
{
if (x>valueb[k]) delete_b(rsb[k],x);
else delete_b(lsb[k],x);
}
}
void pre_b(int k,int x)
{
if (k==0) return;
if (valueb[k]<x)
{
preb=valueb[k];
pre_b(rsb[k],x);
}
else pre_b(lsb[k],x);
}
void sub_b(int k,int x)
{
if (k==0) return;
if (valueb[k]>x)
{
subb=valueb[k];
sub_b(lsb[k],x);
}
else sub_b(rsb[k],x);
}
void work()
{
scanf("%d%d",&type,&x);
if (type==0)
{
if (cntb==0) {insert_a(roota,x);cnta++;return;}
else
{
cntb--;
pre_b(rootb,x);sub_b(rootb,x);
int l=abs(x-preb),r=abs(x-subb);
if (preb==0)
{
delete_b(rootb,subb);
ans=(ans+r)%mod;
return;
}
if (l<=r) delete_b(rootb,preb);
else delete_b(rootb,subb);
ans=(ans+min(l,r))%mod;
clear_();
}
}
else
{
if (cnta==0) {insert_b(rootb,x);cntb++;return;}
else
{
cnta--;
pre_a(roota,x);sub_a(roota,x);
int l=abs(x-prea),r=abs(x-suba);
if (prea==0)
{
delete_a(roota,suba);
ans=(ans+r)%mod;
return;
}
if (l<=r) delete_a(roota,prea);
else delete_a(roota,suba);
ans=(ans+min(l,r))%mod;
clear_();
}
}
}
int main()
{
scanf("%d",&q);
for (int k=1;k<=q;k++)
work();
printf("%d\n",ans);
return 0;
}

int random_fuck_bzoj () {
static unsigned int seed = 35432454U ;
return seed = seed * 10007 + 23 * 17 * 3 ;
}