splay

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct data
{
int fa,l,r,size,cnt,key;
}tree[];
bool flag1,flag2;
int root,n,tot,ans,a,b;
int abs(int x)
{
return x>?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==)
{
++tot;
tree[tot].fa=x;
if(x) tree[x].r=tot;
tree[tot].key=k;
tree[tot].cnt=;
update(tot);
update(x);
splay(tot);
return;
}
insert(tree[x].r,k);
update(x);
}
else
{
if(tree[x].l==)
{
++tot;
tree[tot].fa=x;
if(x) tree[x].l=tot;
tree[tot].key=k;
tree[tot].cnt=;
update(tot);
update(x);
splay(tot);
return;
}
insert(tree[x].l,k);
update(x);
}
}
void findnxt(int x,int k,int pd)
{
if(x==) return;
if(pd==)
{
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,);
findnxt(root,x,);
int temp=;
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==) ans+=x;
else ans+=temp;
insert(root,x);
flag1=false;
flag2=false;
a=;
b=;
}
printf("%d",ans);
return ;
}

bzoj1588的更多相关文章

  1. 【bzoj1588】 HNOI2002—营业额统计

    http://www.lydsy.com/JudgeOnline/problem.php?id=1588 (题目链接) 题意 给出一个序列,对于每一个数,找出之前与它相差最小的数,两者相减取绝对值加入 ...

  2. BZOJ1588 [HNOI2002]营业额统计 set

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1588 题意概括 给出数列,求  ∑F[i],其中F[1] = a[1] , F[i] = min( ...

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

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 14151  Solved: 5366[Submit][Sta ...

  4. BZOJ1588[HNOI2002]营业额统计

    传送门 平衡树常规题,给出两种实现算法 Treap版: //OJ 1610 //by Cydiater //2016.9.1 #include <iostream> #include &l ...

  5. BZOJ1588——[HNOI2002]营业额统计

    1.题目大意:一个简单的treap模板题(我才不告诉你题目少一句话呢,看discuss去 2.分析:treap模板题 #include <cstdio> #include <cstd ...

  6. 营业额统计(bzoj1588)

    Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...

  7. 【BZOJ-1588】营业额统计 Splay

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 12485  Solved: 4508[Submit][Sta ...

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

    [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4128  Solved: 1305 Description 营业额统计 ...

  9. bzoj1588,1208,1503

    进入splay tree的学习中: 据说splay tree在理论上功能十分强大,好好学: splay首先一定是一棵BST,所以记不得的时候画个图就明白: 首先总结一下splay基本的操作左旋,右旋: ...

随机推荐

  1. Git常用命令总结

    Git常用命令总结 git init      在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个repo,并在当前文件夹下创建一个.git文件夹.   git clone ...

  2. ToolWindow工具类

    package com.dute.dutenews.utils; import android.app.Activity; import android.content.Context; import ...

  3. Android客户端与Eclipse服务器端的Socket通信

    Server端代码 用来实现客户端socket的监听 package MyServer; import java.io.BufferedReader; import java.io.BufferedW ...

  4. 浅谈c#中的delegate和event了

    一.开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那.好了,那就趁着阳光明媚的早晨简单来谈谈delegate和ev ...

  5. [C#6] 4-string 插值

    0. 目录 C#6 新增特性目录 1. 老版本的代码 internal class Person { public string Name { get; set; } public int Age { ...

  6. MySQL查看数据库相关信息

    使用MySQL时,需要了解当前数据库的情况,例如当前的数据库大小.字符集.用户等等.下面总结了一些查看数据库相关信息的命令   1:查看显示所有数据库 mysql> show databases ...

  7. Linux系统VNC配置实践总结

    VNC概述 VNC (Virtual Network Computing)是虚拟网络计算机的缩写.VNC 是一款优秀的远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发的.VNC 是在 ...

  8. SQL SERVER Transactional Replication中添加新表如何不初始化整个快照

    在SQL SERVER的复制(Replication)中,有可能出现由于业务需求变更,需要新增一张表或一些表到已有的复制(发布订阅)当中,这种需求应该是很正常,也很常见的.但是在已有的复制(发布订阅) ...

  9. linq to sql 输出SQL语句

    DataClassesDataContext db = new DataClassesDataContext(); db.Log=Response.Output; var result = from ...

  10. makefile之VPATH和vpath的使用

    来自阅读陈皓的<跟我一起写makefile> VPATH变量 在一些大的工程中,有大量的源文件,我们通常的做法是把这许多的源文件分类,并存放在不同的目录中.所以,当 make 需要去找寻文 ...