欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

1565:营业额统计(平衡树)

程序员文章站 2022-07-14 09:37:32
...

1565:营业额统计(平衡树) 1565:营业额统计(平衡树)

 注意:以下代码最后一个点会 T,输入改成快读应该可以过

const int N=5e5+5;
 
    int n,m,t;
    int i,j,k;
    int a[N];
    struct Node
    {
        int l,r;
        int fa,prl,val; //父节点,优先级,值
    }node[N];
    int root=0,tree=0; //根,节点个数


void zig(int &x) //右旋
{
    int y=node[x].l;
    node[x].l=node[y].r;
    node[y].r=x;
    x=y;
}

void zag(int &x) //左旋
{
    int y=node[x].r;
    node[x].r=node[y].l;
    node[y].l=x;
    x=y;
}

void insert(int &id,const int w)
{   
    if(!id){
        id=++tree;
        node[id].val=w;
        node[id].prl=rand();
        return ;
    }
    if(node[id].val>w){
        int L=node[id].l;
        insert(node[id].l,w);
        if(node[id].prl>node[L].prl) zig(id);
    } else{
        int R=node[id].r;
        insert(node[id].r,w);
        if(node[id].prl>node[R].prl) zag(id);
    }
}

int query_pre(const int w) //求比 w 小的最大数
{
    int id=root,ans=-inf;
    while(id){
        if(w>=node[id].val){ ans=node[id].val; id=node[id].r; }
        else id=node[id].l;
    }
    return ans;
}

int query_suf(const int w)
{
    int id=root,ans=inf;
    while(id){
        if(node[id].val>=w){ ans=node[id].val; id=node[id].l; }
        else id=node[id].r;
    }
    return ans;
}

int main()
{
    while(~sd(n)){
        for(i=1;i<=n;i++) sd(a[i]);
        int ans=a[1];
        insert(root,a[1]);
        int x,y;
        for(i=2;i<=n;i++){
            x=query_pre(a[i]);
            y=query_suf(a[i]);
            ans+=min(a[i]-x,y-a[i]);
            //dbg(root);
            insert(root,a[i]);
        }
        pd(ans);
    }
    //PAUSE;
    return 0;
}

 

相关标签: 信息学奥赛