poj3481Double Queue SBT

5 篇文章 0 订阅
直接上,多一个数组记编号。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
#define maxm 51000
#define maxn 210000
int getint()
{
    char c;
    int res;
    while(c=getchar(),c<'0'||c>'9');
    res=c-'0';
    while(c=getchar(),c>='0'&&c<='9')
        res=res*10+c-'0';
    return res;
}
int n,m,l,r,root,cnt,col[maxn],val[maxn],ls[maxn],rs[maxn],siz[maxn];
void rotate_r(int &x)
{
    int y=ls[x];
    siz[y]=siz[x];
    ls[x]=rs[y];
    rs[y]=x;
    siz[x]=siz[ls[x]]+siz[rs[x]]+1;
    x=y;
}
void rotate_l(int &x)
{
    int y=rs[x];
    siz[y]=siz[x];
    rs[x]=ls[y];
    ls[y]=x;
    siz[x]=siz[ls[x]]+siz[rs[x]]+1;
    x=y;
}
void maintain(int& x,int fg)
{
    if(!fg)
    {
        if(siz[ls[ls[x]]]>siz[rs[x]]) rotate_r(x);
        else if(siz[rs[ls[x]]]>siz[rs[x]]) rotate_l(ls[x]),rotate_r(x);
        else return ;
    }
    else
    {
        if(siz[rs[rs[x]]]>siz[ls[x]]) rotate_l(x);
        else if(siz[ls[rs[x]]]>siz[ls[x]]) rotate_r(rs[x]),rotate_l(x);
        else return ;
    }
    maintain(ls[x],0);maintain(rs[x],1);
    maintain(x,0);maintain(x,1);
}
void insert(int& x,int b,int id)
{
    if(!x)
    {
        cnt++;
        x=cnt;
        ls[x]=rs[x]=0;
        siz[x]=1;
        val[x]=b;
        col[x]=id;
    }
    else
    {
        siz[x]++;
        if(b>val[x]) insert(rs[x],b,id);
        else insert(ls[x],b,id);
        maintain(x,b>=val[x]);
    }
}
int delt(int& x,int b)
{
    siz[x]--;
    if(b==val[x]||(b<val[x]&&ls[x]==0)||(b>val[x]&&rs[x]==0))
    {
        int y=val[x];
        if(ls[x]==0||rs[x]==0) x=ls[x]+rs[x];
        else
        {
            int z=delt(ls[x],val[x]+1);
            val[x]=val[z]; col[x]=col[z];
        }
        return y;
    }
    else
    {
        if(b<val[x]) return delt(ls[x],b);
        else return delt(rs[x],b);
    }
}
int getmin(int x)
{
    int i;
    for(i=x;ls[i];i=ls[i]);
    return i;
}
int getmax(int x)
{
    int i;
    for(i=x;rs[i];i=rs[i]);
    return i;
}
void sbt()
{
    int op,a,b,f;
    for(;scanf("%d",&op)&&op;)
    {
        if(op==1)
        {
            a=getint();
            b=getint();
            insert(root,b,a);
        }
        if(op==3)
        {
            f=getmin(root);
            printf("%d\n",col[f]);
            if(f) delt(root,val[f]);
        }
        if(op==2)
        {
            f=getmax(root);
            printf("%d\n",col[f]);
            if(f) delt(root,val[f]);
        }
    }
}
int main()
{
    sbt();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值