bzoj1208

splay 120ms

#include<cstdio>
#include<cctype>
#include<algorithm>
#define maxn 80002
#define mod 1000000
using namespace std;
int n,rt,typ,sz,ans,t1,t2;
int cnt[maxn],siz[maxn],f[maxn],tr[maxn][2],key[maxn];

inline void read(int &x){
    char ch=getchar();x=0;int f=1;
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    x*=f;
}

inline void clear(int x){
    tr[x][0]=tr[x][1]=f[x]=siz[x]=cnt[x]=key[x]=0;
}

void updata(int x){
    if(x){
        siz[x]=cnt[x];
        if(tr[x][0])siz[x]+=siz[tr[x][0]];
        if(tr[x][1])siz[x]+=siz[tr[x][1]];
    }
}

void rotate(int x){
    int old=f[x],oldf=f[old],whicx=(tr[f[x]][1]==x);
    tr[old][whicx]=tr[x][whicx^1];f[tr[old][whicx]]=old;
    tr[x][whicx^1]=old;f[old]=x;
    f[x]=oldf;
    if(oldf)tr[oldf][tr[oldf][1]==old]=x;
    updata(old);updata(x);
}

void splay(int x){
    for(int fa;fa=f[x];rotate(x))
       if(f[fa])rotate((tr[f[x]][1]==x)==(tr[f[fa]][1]==fa)?fa:x);
    rt=x;
}

void insert(int x){
    if(!rt){sz++;tr[sz][0]=tr[sz][1]=f[sz]=0;rt=sz;siz[sz]=cnt[sz]=1;key[sz]=x;return;}//
    int now=rt,fa=0;
    while(1){
        if(x==key[now]){cnt[now]++;updata(now);updata(fa);splay(now);break;}
        fa=now;
        now=tr[now][key[now]<x];
        if(now==0){
            sz++;
            tr[sz][0]=tr[sz][1]=0;
            f[sz]=fa;
            siz[sz]=cnt[sz]=1;
            tr[fa][key[fa]<x]=sz;
            key[sz]=x;
            updata(fa);
            splay(sz);
            break;
        }
    }
}
(一开始没看题目,考虑了特点值和希望值一样的情况)
inline int pre(){
    int now=tr[rt][0];
    while(tr[now][1])now=tr[now][1];
    return now; 
}
inline int nex(){
    int now=tr[rt][1];
    while(tr[now][0])now=tr[now][0];
    return now;
}

inline void pre(int b){
    for(int x=rt;x;){
        if(key[x]<=b){t1=x;x=tr[x][1];}else x=tr[x][0];
    }
}
inline void nex(int b){
    for(int x=rt;x;){
        if(key[x]>=b){t2=x;x=tr[x][0];}else x=tr[x][1];
    }
} 

void del(int x){
    splay(x);
    if(cnt[rt]>1){cnt[rt]--;updata(rt);return;}
    if(!tr[rt][0]&&!tr[rt][1]){clear(rt);rt=0;return;}
    if(!tr[rt][0]){int oldrt=rt;rt=tr[rt][1];f[rt]=0;clear(oldrt);return;}
    if(!tr[rt][1]){int oldrt=rt;rt=tr[rt][0];f[rt]=0;clear(oldrt);return;}
    int lefb=pre(),oldrt=rt;
    splay(lefb);
    tr[rt][1]=tr[oldrt][1];
    f[tr[oldrt][1]]=rt;
    clear(oldrt);
    updata(rt);
}

int main(){
    read(n);
    int a,b;
    while(n--){
        read(a);read(b);
        if(!rt){typ=a;insert(b);}else
        if(a==typ)insert(b);
        else{
            t1=t2=-1;
            pre(b);nex(b);
            if(t1==-1){ans+=key[t2]-b;ans%=mod;del(t2);}else
            if(t2==-1){ans+=b-key[t1];ans%=mod;del(t1);}else{
                if(b-key[t1]>key[t2]-b){ans+=key[t2]-b;ans%=mod;del(t2);}
                else{ans+=b-key[t1];ans%=mod;del(t1);}
            }
        }
    }
    printf("%d\n",ans);
}

sbt(抄板子的)216ms

#include<cstdio>
#include<cstring>
#include<cctype>
#define mod 1000000
#define maxn 80001
using namespace std;
int rt,sz,man,n;
struct data{int l,r,siz,key;void init(int val){l=r=0;siz=1;key=val;}}sbt[maxn];

inline void read(int &x){
    char ch=getchar();x=0;int f=1;
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    x*=f;
}

void zig(int &t){
    int k=sbt[t].r;
    sbt[t].r=sbt[k].l;
    sbt[k].l=t;
    sbt[k].siz=sbt[t].siz;
    sbt[t].siz=sbt[sbt[t].l].siz+sbt[sbt[t].r].siz+1;
    t=k;
}

void zag(int &t){
    int k=sbt[t].l;
    sbt[t].l=sbt[k].r;
    sbt[k].r=t;
    sbt[k].siz=sbt[t].siz;
    sbt[t].siz=sbt[sbt[t].l].siz+sbt[sbt[t].r].siz+1;
    t=k;
}
void maintain(int &x,bool flag){
    if(!flag){
        if(sbt[sbt[sbt[x].l].l].siz>sbt[sbt[x].r].siz)zag(x);
        else if(sbt[sbt[sbt[x].l].r].siz>sbt[sbt[x].r].siz){
            zig(sbt[x].l);zag(x);
        }else return;
    }
    else{
        if(sbt[sbt[sbt[x].r].r].siz>sbt[sbt[x].l].siz)zig(x);
        else if(sbt[sbt[sbt[x].r].l].siz>sbt[sbt[x].l].siz){
            zag(sbt[x].r);zig(x);
        }else return;
    }
    maintain(sbt[x].l,0);
    maintain(sbt[x].r,1);
    maintain(x,0);
    maintain(x,1);
}
void insert(int &x,int key){
    if(!x){x=++sz;sbt[x].init(key);}
    else{
        sbt[x].siz++;
        insert(key<sbt[x].key?sbt[x].l:sbt[x].r,key);
        maintain(x,key>=sbt[x].key);
    }
}

int del(int &x,int key){
    if(!x)return 0;
    sbt[x].siz--;
    if(key==sbt[x].key||(key<sbt[x].key&&!sbt[x].l)||(key>sbt[x].key&&!sbt[x].r)){
        if(sbt[x].l&&sbt[x].r){
            int pos=del(sbt[x].l,key+1);
            sbt[x].key=sbt[pos].key;
            return pos;
        }else{
            int pos=x;
            x=sbt[x].l+sbt[x].r;
            return pos;
        }
    }
        else return del(key<sbt[x].key?sbt[x].l:sbt[x].r,key);
}

int pre(int x,int key){
    if(!x)return key;
    if(key<=sbt[x].key)return pre(sbt[x].l,key);
    else{
        int tmp=pre(sbt[x].r,key);
        return key==tmp?sbt[x].key:tmp;
    }
}

int nex(int x,int key){
    if(!x)return key;
    if(key>=sbt[x].key)return nex(sbt[x].r,key);
    else{
        int tmp=nex(sbt[x].l,key);
        return key==tmp?sbt[x].key:tmp;
    }
}

int main(){
   while(scanf("%d",&n)!=EOF){
    int a,b,typ,ans=0;rt=sz=0;
    while(n--){
        read(a);read(b);
        if(!rt){
            man=a;insert(rt,b);
        }
        else{
            if(man==a)insert(rt,b);
            else {
                int x=pre(rt,b);int y=nex(rt,b);
                int tmp1=b-x,tmp2=y-b;
                if(tmp1==0){ans=(ans+tmp2)%mod;del(rt,y);}
                else if(tmp2==0){ans=(ans+tmp1)%mod;del(rt,x);}
                else if(tmp1<=tmp2){ans=(ans+tmp1)%mod;del(rt,x);}
                else {ans=(ans+tmp2)%mod;del(rt,y);}
            }
        }
    }
    printf("%d\n",ans);
   }
}

 

转载于:https://www.cnblogs.com/MikuKnight/p/9045155.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值