splay tree-hnoi2002 营业额统计

多组数据,读到EOF的时候X=0//贼坑
n个点,每插入一个点找到之前插入的点之中和它相差最小的点,ans+=两者之差。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
const int oo=100000010;
int root,top,ans;
struct node{
    int l,r,f,w;
}tree[100010];
void New(int x,int father){
    tree[++top].w=x;
    tree[top].f=father;
    return;
}
int min(int  x,int y){
    if(x>y)return y;
    else return x;
}
void zig(int d){
    int fa=tree[d].f;
    int prefa=tree[fa].f;
    if(tree[prefa].l==fa)
        tree[prefa].l=d;
    else
        tree[prefa].r=d;
    tree[fa].f=d;
    tree[fa].l=tree[d].r;
    tree[d].f=prefa;
    if(tree[d].r)
        tree[tree[d].r].f=fa;
    tree[d].r=fa;
    return;
}
void zag(int d){
    int fa=tree[d].f;
    int prefa=tree[fa].f;
    if(tree[prefa].l==fa)
        tree[prefa].l=d;
    else
        tree[prefa].r=d;
    tree[fa].f=d;
    tree[fa].r=tree[d].l;
    tree[d].f=prefa;
    if(tree[d].l)
        tree[tree[d].l].f=fa;
    tree[d].l=fa;
    return;
}
void splay(int x){
    int d=root;
    while(1){
        if(x<tree[d].w){
            if(!tree[d].l)
                break;
            d=tree[d].l;
        }
        else {
            if(!tree[d].r)
                break;
            d=tree[d].r;
        }
    }

    New(x,d);
    if(x<tree[d].w)
        tree[d].l=top;
    else tree[d].r=top;

    while(tree[top].f){
        if(tree[top].f==root){
            if(tree[root].l==top)
                zig(top);
            else
                zag(top);
            break;
        }
        else {
            int fa=tree[top].f;
            int prefa=tree[fa].f;
            if(tree[fa].l==top){
                if(tree[prefa].l==fa)
                    zig(fa);
                zig(top);
            }
            else if(tree[fa].r==top){
                if(tree[prefa].r==fa)
                    zag(fa);
                zag(top);
            }
        }
    }
    root=top;
    return;
}
int find(int x){
    int d=root;
    while(1){
        if(x==tree[d].w)
            return 0;
        if(x<tree[d].w){
            if(!tree[d].l)
                return 1;
            d=tree[d].l;
        }
        else {
            if(!tree[d].r)
                return 1;
            d=tree[d].r;
        }
    }
    return 1;
}
int z(){
    int d=tree[root].l;
    if(!d)return oo;
    while(tree[d].r)
        d=tree[d].r;
    return tree[d].w;
}
int y(){
    int d=tree[root].r;
    if(!d)return oo;
    while(tree[d].l)
        d=tree[d].l;
    return tree[d].w;
}
void clear(int n){
    for(int i=0;i<=n;i++){
        tree[i].w=0;
        tree[i].f=0;
        tree[i].l=0;
        tree[i].r=0;
    }
}
int main(){
    int i,x,n;
    while(~scanf("%d",&n)){
        root=ans=top=0;
        for(i=1;i<=n;i++){
            if(scanf("%d",&x)==EOF)x=0;

            if(i==1){
                ans+=x;
                New(x,0);
                tree[0].l=1;
                root=top;
                continue;
            }
            if(!find(x))
                continue;

            splay(x);
            int x1=abs(x-z());
            int x2=abs(x-y());
            ans+=min(x1,x2);
        }
        printf("%d\n",ans);
        clear(n);
    }
    return 0;
}

In put
6
5
1
2
5
4
6
Out put
12

"sgmediation.zip" 是一个包含 UCLA(加利福尼亚大学洛杉矶分校)开发的 sgmediation 插件的压缩包。该插件专为统计分析软件 Stata 设计,用于进行中介效应分析。在社会科学、心理学、市场营销等领域,中介效应分析是一种关键的统计方法,它帮助研究人员探究变量之间的因果关系,尤其是中间变量如何影响因变量与自变量之间的关系。Stata 是一款广泛使用的统计分析软件,具备众多命令和用户编写的程序来拓展其功能,sgmediation 插件便是其中之一。它能让用户在 Stata 中轻松开展中介效应分析,无需编写复杂代码。 下载并解压 "sgmediation.zip" 后,需将解压得到的 "sgmediation" 文件移至 Stata 的 ado 目录结构中。ado(ado 目录并非“adolescent data organization”缩写,而是 Stata 的自定义命令存放目录)目录是 Stata 存放自定义命令的地方,应将文件放置于 "ado\base\s" 子目录下。这样,Stata 启动时会自动加载该目录下的所有 ado 文件,使 "sgmediation" 命令在 Stata 命令行中可用。 使用 sgmediation 插件的步骤如下:1. 安装插件:将解压后的 "sgmediation" 文件放入 Stata 的 ado 目录。如果 Stata 安装路径是 C:\Program Files\Stata\ado\base,则需将文件复制到 C:\Program Files\Stata\ado\base\s。2. 启动 Stata:打开 Stata,确保软件已更新至最新版本,以便识别新添加的 ado 文件。3. 加载插件:启动 Stata 后,在命令行输入 ado update sgmediation,以确保插件已加载并更新至最新版本。4
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值