bzoj1588

splay

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct data
{
    int fa,l,r,size,cnt,key;
}tree[100010];
bool flag1,flag2;
int root,n,tot,ans,a,b;
int abs(int x)
{
    return x>0?x:-x;
}
void update(int x)
{
    tree[x].size=tree[tree[x].l].size+tree[tree[x].r].size+tree[x].cnt;
}
void zig(int x)
{
    int y=tree[x].fa;
    int z=tree[x].r;
    tree[y].l=z;
    tree[z].fa=y;
    tree[x].fa=tree[y].fa;
    if(y==tree[tree[y].fa].l) tree[tree[y].fa].l=x;
    else tree[tree[y].fa].r=x;
    tree[x].r=y;
    tree[y].fa=x;
    update(x);
    update(y);
}
void zag(int x)
{
    int y=tree[x].fa;
    int z=tree[x].l;
    tree[y].r=z;
    tree[z].fa=y;
    tree[x].fa=tree[y].fa;
    if(y==tree[tree[y].fa].l) tree[tree[y].fa].l=x;
    else tree[tree[y].fa].r=x;
    tree[x].l=y;
    tree[y].fa=x;
    update(x);
    update(y);
}
void splay(int x)
{
    if(!root)
    {
        root=x;
        return;
    }
    while(tree[x].fa)
    {
        int y=tree[x].fa;
        int z=tree[y].fa;
        if(y==root)
        {
            if(x==tree[root].l) zig(x); else zag(x);
            update(x);
            break;
        }
        else if(y==tree[z].l&&x==tree[y].l) {zig(y); zig(x);}
        else if(y==tree[z].r&&x==tree[y].r) {zag(y); zag(x);}
        else if(y==tree[z].l&&x==tree[y].r) {zag(x); zig(x);}
        else if(y==tree[z].r&&x==tree[y].l) {zig(x); zag(x);}
        update(x);
    }
    root=x;
}
void insert(int x,int k)
{
    if(tree[x].key<k)
    {
        if(tree[x].r==0)
        {
            ++tot;
            tree[tot].fa=x;
            if(x) tree[x].r=tot;
            tree[tot].key=k;
            tree[tot].cnt=1;
            update(tot);
            update(x);
            splay(tot);
            return;
        }
        insert(tree[x].r,k);
        update(x);
    }
    else
    {
        if(tree[x].l==0)
        {
            ++tot;
            tree[tot].fa=x;
            if(x) tree[x].l=tot;
            tree[tot].key=k;
            tree[tot].cnt=1;
            update(tot);
            update(x);
            splay(tot);
            return;
        }
        insert(tree[x].l,k);
        update(x);
    }
}
void findnxt(int x,int k,int pd)
{
    if(x==0) return;
    if(pd==0)
    {
        if(tree[x].key<=k)
        {
            flag1=true;
            a=tree[x].key;
            findnxt(tree[x].r,k,pd);
        } else findnxt(tree[x].l,k,pd);
    }
    else
    {
        if(tree[x].key>=k)
        {
            flag2=true;
            b=tree[x].key;
            findnxt(tree[x].l,k,pd);
        } else findnxt(tree[x].r,k,pd);
    }
}
int main()
{
    scanf("%d",&n);
    while(n--)
    {
        int x; scanf("%d",&x);
        findnxt(root,x,0);
        findnxt(root,x,1);
        int temp=0;
        bool flag=false;
//        printf("%d %d\n",a,b);
        if(flag1)
        {
            temp=abs(a-x);
            flag=true;
        }
        if(flag2)
        {
            if(flag) temp=min(temp,abs(b-x));
            else temp=abs(b-x);
        }
        if(tree[root].size==0) ans+=x;
        else ans+=temp;
        insert(root,x);
        flag1=false;
        flag2=false;
        a=0;
        b=0;
    }
    printf("%d",ans);
    return 0;
}
时间: 2024-10-14 11:16:17

bzoj1588的相关文章

BZOJ1588 营业额统计 splay tree

最基本的平衡树操作吧,第一次学splay的可以做一下 只需要插入,删除,旋转,求前驱,后继这5个操作吧 不喜欢用指针,用数组写的 <span style="color:#00cccc;">//HNOI2002营业额统计 #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define INF 1<<30 #define

BZOJ1588: [HNOI2002]营业额统计(正解:平衡树,我的歪解:暴力)

Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题.经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大

营业额统计(bzoj1588)

Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题.经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大

BZOJ1588 [HNOI2002] 营业额统计

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 又是一道Treap模版题……总做模版题不好…… 另外牢记:BZOJ上用srand(time(0))会RE! 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <ctime> 6 #defin

bzoj1588: [HNOI2002]营业额统计 splay瞎写

最近各种瞎写数论题,感觉需要回顾一下数据结构 写一发splay冷静一下(手速过慢,以后要多练练) 用splay是最直接的方法,但我感觉离散一波应该可以做出来(没仔细想过) 现在没有很追求代码优美,感觉得先打的对打的快O(∩_∩)O 1 #include <bits/stdc++.h> 2 #define INF 1000000000 3 using namespace std; 4 int root,N,n,x; 5 int fa[100005],c[100005][2],a[100005];

BZOJ1588: [HNOI2002]营业额统计[BST]

1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 14151  Solved: 5366[Submit][Status][Discuss] Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其

BZOJ1588 HNOI2002 营业额统计 [Splay入门题]

[HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4128  Solved: 1305 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其他情况的时候,营业 额会出现一定的波动,当然一定的波动是能够接受

bzoj1588 [HNOI2002]营业额统计 (平衡树)

平衡树裸题 只需要求前驱后驱 treap写法 const mm=1<<30; maxnumber=500000; maxn=500000; var left,right,fix,key:array[0..maxn]of longint; t,n,ans,i,j,k,l,tot:longint; function min(x,y:longint):longint; begin if x<y then exit(x); exit(y); end; function max(x,y:longi

【BZOJ-1588】营业额统计 Splay

1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 12485  Solved: 4508[Submit][Status][Discuss] Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其

bzoj1588 营业额统计 题解--Treap

Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题.经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大