bzoj1208 [HNOI2004]宠物收养所 splay入门

来源:互联网 发布:淘宝网名昵称大全2016 编辑:程序博客网 时间:2024/06/10 07:14

Description

最近,阿Q开了一间宠物收养所。收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物。每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^31),而他也给每个处在收养所的宠物一个特点值。这样他就能够很方便的处理整个领养宠物的过程了,宠物收养所总是会有两种情况发生:被遗弃的宠物过多或者是想要收养宠物的人太多,而宠物太少。 1. 被遗弃的宠物过多时,假若到来一个领养者,这个领养者希望领养的宠物的特点值为a,那么它将会领养一只目前未被领养的宠物中特点值最接近a的一只宠物。(任何两只宠物的特点值都不可能是相同的,任何两个领养者的希望领养宠物的特点值也不可能是一样的)如果有两只满足要求的宠物,即存在两只宠物他们的特点值分别为a-b和a+b,那么领养者将会领养特点值为a-b的那只宠物。 2. 收养宠物的人过多,假若到来一只被收养的宠物,那么哪个领养者能够领养它呢?能够领养它的领养者,是那个希望被领养宠物的特点值最接近该宠物特点值的领养者,如果该宠物的特点值为a,存在两个领养者他们希望领养宠物的特点值分别为a-b和a+b,那么特点值为a-b的那个领养者将成功领养该宠物。 一个领养者领养了一个特点值为a的宠物,而它本身希望领养的宠物的特点值为b,那么这个领养者的不满意程度为abs(a-b)。【任务描述】你得到了一年当中,领养者和被收养宠物到来收养所的情况,希望你计算所有收养了宠物的领养者的不满意程度的总和。这一年初始时,收养所里面既没有宠物,也没有领养者。

Input

第一行为一个正整数n,n<=80000,表示一年当中来到收养所的宠物和领养者的总数。接下来的n行,按到来时间的先后顺序描述了一年当中来到收养所的宠物和领养者的情况。每行有两个正整数a, b,其中a=0表示宠物,a=1表示领养者,b表示宠物的特点值或是领养者希望领养宠物的特点值。(同一时间呆在收养所中的,要么全是宠物,要么全是领养者,这些宠物和领养者的个数不会超过10000个)

Output

仅有一个正整数,表示一年当中所有收养了宠物的领养者的不满意程度的总和mod 1000000以后的结果。

Sample Input

5
0 2
0 4
1 3
1 2
1 5

Sample Output

3


题目描述很清楚,把人和狗都当作节点插入,然后每次查找就行了,删除时就把它的后继拿上来,有注释的


/**************************************************************    Problem: 1208    User: yslcl1234    Language: C++    Result: Accepted    Time:108 ms    Memory:3012 kb****************************************************************/ #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn=111111;const int mod=1000000;const int inf=0x3fffffff;int ch[maxn][2],f[maxn],val[maxn],num[2]={0},rt=0,top=0;inline int read(){    char c=getchar();    int s=0;    while(c<'0'||c>'9')c=getchar();    do{        s=s*10+c-'0';        c=getchar();    }while(c>='0'&&c<='9');    return s;}inline void newnode(int y,int &x,int a){    x=++top;    val[x]=a;    f[x]=y;    ch[x][1]=ch[x][0]=0;}inline void rotate(int x,int c) {    int y=f[x],z=f[y];    ch[y][!c]=ch[x][c];    f[ch[x][c]]=y;    f[x]=z;    if(z)ch[z][ch[z][1]==y]=x;    ch[x][c]=y;    f[y]=x;}inline void splay(int x,int goal){    while(f[x]!=goal)    {        int y=f[x],z=f[y];        if(z==goal)        {            if(ch[y][0]==x)rotate(x,1);            else rotate(x,0);        }        else{            if(ch[z][0]==y)            {                if(ch[y][0]==x)rotate(y,1),rotate(x,1);                else rotate(x,0),rotate(x,1);            }            else{                if(ch[y][1]==x)rotate(y,0),rotate(x,0);                else rotate(x,1),rotate(x,0);            }        }    }    if(goal==0)rt=x;}inline void insert(int a){    int x=rt;    while(ch[x][val[x]<a])x=ch[x][val[x]<a];    newnode(x,ch[x][val[x]<a],a);    splay(top,0);}inline int min1(int a,int b){return a<b?a:b;}//看可以节 inline int max1(int a,int b){return a>b?a:b;}//省时间不 inline int findnear(int a,int f)//找前驱后继 {    int x=rt,m=inf*f;    while(x)    {        if(val[x]==a)return a;        if(f>0){if(val[x]>a)m=min1(m,val[x]);}//如果f为真,则为寻找大于a的最小值,否则为小于a的最大值         else if(val[x]<a&&f<0)m=max1(m,val[x]);        x=ch[x][val[x]<a];    }    return m;}inline int find(int a){    int x=rt;    while(x)    {        if(val[x]==a)return x;        x=ch[x][val[x]<a];    }    return 0;}inline void del(int x){    splay(x,0);    int t=ch[rt][1];    while(ch[t][0])t=ch[t][0];    splay(t,rt);    ch[t][0]=ch[rt][0];    f[ch[rt][0]]=t;    f[t]=0;    rt=t;}int main(){    int n,i,ans=0;    n=read();    newnode(0,rt,-inf);    newnode(rt,ch[rt][1],inf);    for(i=1;i<=n;i++)    {        int a=read(),b=read();        if(num[!a]==0)//num[0]表示有几条狗 ,num[1]表示有几个人        {            num[a]++;            insert(b);        }        else{            int minn=findnear(b,1),maxx=findnear(b,-1);            ans=(ans+min1(minn-b,b-maxx))%mod;            if(b-maxx<=minn-b)del(find(maxx));            else del(find(minn));            num[!a]--;        }    }    printf("%d",ans%mod);}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 养了一年母鸽子不配对怎么办 血管翳云翳斑翳长满眼睛怎么办 鸽子训放50公里突然下雨了怎么办 安卓手机反应慢又卡怎么办 tcl安卓系统电视反应慢怎么办 狼人杀警长竞选一直平票怎么办 去驾校投诉教练被教练报复怎么办 哈尔滨机场大巴六点的飞机怎么办 山东德州恩城镇的农民怎么办养老险 我的世界联机平台房间进不去怎么办 验车时间过了3天怎么办 在携程订的机票和酒店不能退怎么办 千牛工作台中旺旺登录失败怎么办 掌通家园换手机号了忘了更改怎么办 qq注销了后绑定的全民k歌怎么办 小米账号绑定的手机号注销了怎么办 微信账号注销后绑定的手机号怎么办 微信账号不想用了注销不了怎么办 苹果手机掉了捡到不还怎么办 在工作中把和别人结下梁子了怎么办 在阿里巴巴上买的货物没发货怎么办 做了下颌角一边脸反复肿怎么办 玩广东11选5输50万怎么办 玩广东11选5输了十几万怎么办 新办公楼装修好就要搬进去怎么办 oppo手机上的黄页删了怎么办 小米不小心把手机联系人删了怎么办 58同城小区名输不了怎么办 e路发注册直接有积分怎么办 大众速腾的不锈钢圈被碰花了怎么办 公司卡着生育险不给怎么办 济南图书馆借书超过期限了怎么办 淘宝解绑支付宝支付密码不对怎么办 微博支付宝支付密码忘记了怎么办 图虫签约师通过了认证标识怎么办 签证做假工作证明资料被拒怎么办 在广州办个建设厅电工证怎么办 水利考的五大员证到有效期怎么办 额头注射玻尿酸吸收后不平怎么办 施工员证书挂靠拿不回来怎么办 森林公安未转政法编制的人员怎么办