BZOJ1588: [HNOI2002]营业额统计

来源:互联网 发布:linux系统查看cpu主频 编辑:程序博客网 时间:2024/05/20 22:02

题目链接

平衡树插入和查询。

【代码】

#include <cstdio>#include <iostream>#include <queue>#include <vector>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#define N 50005#define M 200005#define INF 1e9+1using namespace std;typedef long long ll;typedef pair<ll,ll> pa;int read(){    int x=0,f=1;char ch=getchar();    while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}    while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}    return x*f;}int n,mn,mx,rt,sz,ans;int son[N][2],fa[N],num[N];void Ask_Min(int k,int x){    if(!k) return;    if(num[k]<=x)    {        mn=num[k];        Ask_Min(son[k][1],x);    }    else Ask_Min(son[k][0],x);}void Ask_Max(int k,int x){    if(!k) return;    if(num[k]>=x)    {        mx=num[k];        Ask_Max(son[k][0],x);    }    else Ask_Max(son[k][1],x);}void Rotate(int x,int &k){    int y=fa[x],z=fa[y],l,r;    l=(son[y][0]!=x);r=l^1;    if(y==k) k=x;    else son[z][son[z][0]!=y]=x;    fa[x]=z;fa[y]=x;fa[son[x][r]]=y;    son[y][l]=son[x][r];son[x][r]=y;}void Splay(int x,int &k){    while(x!=k)    {        int y=fa[x],z=fa[y];        if(y!=k)        {            if((son[z][0]==y)^(son[y][0]==x)) Rotate(x,k);            else Rotate(y,k);        }        Rotate(x,k);    }}void Insert(int &k,int x,int Last){    if(!k)    {        k=++sz;fa[k]=Last;        num[k]=x;Splay(k,rt);        return;    }    if(x<num[k]) Insert(son[k][0],x,k);    else Insert(son[k][1],x,k);}int main(){    n=read();    for(int i=1;i<=n;i++)    {        static int x;        x=read();        mn=-INF,mx=INF;        Ask_Min(rt,x);        Ask_Max(rt,x);        ans+=(i==1)?x:min(x-mn,mx-x);        Insert(rt,x,0);    }    printf("%d\n",ans);    return 0;}
0 0
原创粉丝点击