zoukankan      html  css  js  c++  java
  • BZOJ 1208 宠物收养所

    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 ",ans);
    return 0;
    }

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

  • 相关阅读:
    电子工程师对程序员的一番心里话(转载)
    一个程序员的一生(转载)
    程序人生中的十个感悟...
    谈计算机软件发展观念(转载)
    ASP.NET 2.0服务器控件开发精要(转载)
    一个老程序员的心里话(转载)
    hdu 1316 斐波那契数
    hdu 3117 斐波那契数列
    hdu 1239 素数水题
    hdu 2256 神奇的矩阵
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5190897.html
Copyright © 2011-2022 走看看