BZOJ-1588

zjhl2 posted @ 2015年8月19日 04:11 with tags splay , 330 阅读

第一次写splay,还是写复杂一点吧,左旋右旋都写,不然过几天自己都看不懂了。。

#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<functional>
typedef long long ll;
using namespace std;
//#pragma comment(linker, "/STACK:1024000000,1024000000")
const int N=500005;
int fa[N],c[N],ch[N][2],x,n,i,idn,ans,root;
void look(int i)
{
    if (i==0) return;
    look(ch[i][0]);
    printf("%d ",c[i]);
    look(ch[i][1]);
}
void zag(int x)
{
    int y=fa[x],z=fa[y];
    ch[y][1]=ch[x][0]; fa[ch[y][1]]=y;
    ch[x][0]=y; fa[y]=x;
    fa[x]=z;
    if (z)
        if (ch[z][0]==y) ch[z][0]=x;else ch[z][1]=x;
}
void zig(int x)
{
    int y=fa[x],z=fa[y];
    ch[y][0]=ch[x][1]; fa[ch[y][0]]=y;
    ch[x][1]=y; fa[y]=x;
    fa[x]=z;
    if (z)
        if (ch[z][0]==y) ch[z][0]=x;else ch[z][1]=x;
}
void splay(int x)
{
    while(fa[x])
    {
        int y=fa[x],z=fa[y];
        if (!z)
            if (ch[y][0]==x) zig(x);else zag(x);
        else
        {
            if (ch[z][0]==y)
                if (ch[y][0]==x) zig(y),zig(x);
                else zag(x),zig(x);
            else
                if (ch[y][0]==x) zig(x),zag(x);
                else zag(y),zag(x);
        }
    }
    root=x;
}
void ins(int x,int v)
{
    int nxt;
    if (v<c[x]) nxt=0;else nxt=1;
    while(ch[x][nxt])
    {
        x=ch[x][nxt];
        if (v<c[x]) nxt=0;else nxt=1;
    }
    idn++; ch[x][nxt]=idn; fa[idn]=x; c[idn]=v;
    //look(1);
    splay(idn);
    //look(1);
}
int pre(int x)
{
    int tmp=ch[x][0];
    while(ch[tmp][1]) tmp=ch[tmp][1];
    return c[tmp];
}
int suc(int x)
{
    int tmp=ch[x][1];
    while(ch[tmp][0]) tmp=ch[tmp][0];
    return c[tmp];
}
int main()
{
    scanf("%d",&n);
    idn=1,c[1]=-2000000000; root=1;
    ins(root,2000000000);
    for (i=1;i<=n;i++)
    {
        if (scanf("%d",&x)==-1) x=0;
        if (i==1) ans+=x,ins(root,x);
        else ins(root,x),ans+=min(x-pre(root),suc(root)-x);
        //look(root);printf("\n");
    }
    printf("%d",ans);
}
Avatar_small
Canarabank Netbankin 说:
2022年8月06日 03:17

Canara Bank has been providing service to their customers since 1906 and in this meantime it has seen great growth, and the banking network in modern technology and providing easy services to every customer in their footsteps has emerged with great technology growth. Canarabank Netbanking Login Canara bank net banking service by giving various options to the customer which enables them not to walk to the branch office to use every option.Bank as well got their branch setup virtually with having multiple customer support assistance which ensure that their customer account creates online and as well get used to other services.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter