【Treap】BZOJ1588-[HNOI2002]营业额统计
【题目大意】
[借用别人的概括]给出一个n个数的数列a,对于第i个元素ai定义fi=min(abs(ai-aj)),(1<=j<i),其中f1=a1。输出sum(fi) (1<=i<=n)
【思路】
平衡树,易知绝对值最小的一定是前缀和后继。要注意的是由于ai和aj可能相等,即min可能等于零,要加一个判断:如果当前平衡树中的key等于要找的值,并且当前结点的cnt大于一个,则说明之前有一个值和当前相等。另外有些情况下当前要找的结点可能没有前驱或者后继,需要判断一下。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int INF=0x7fffffff;
struct treap
{
int key;
int priority;
treap* lson;
treap* rson;
int cnt;
treap()
{
key=;
cnt=;
/*这里初始值为1*/
priority=rand();
lson=rson=NULL;
}
};
treap* root=NULL; void RightRotate(treap* &rt)
{
treap* tmp=rt->lson;
rt->lson=tmp->rson;
tmp->rson=rt;
rt=tmp;
} void LeftRotate(treap* &rt)
{
treap *tmp=rt->rson;
rt->rson=tmp->lson;
tmp->lson=rt;
rt=tmp;
} void insert(treap* &rt,int x)
{
if (rt==NULL)
{
rt=new treap;
rt->key=x;
}
else
{
if (rt->key==x)
{
rt->cnt++;
}
else if (rt->key>x)
{
insert(rt->lson,x);
if (rt->lson->priority>rt->priority) RightRotate(rt);
}
else
{
insert(rt->rson,x);
if (rt->rson->priority>rt->priority) LeftRotate(rt);
}
}
} int pre(treap* &rt,int x)
{
int ans=-INF;
treap* tmp=rt;
while (tmp)
{
if (tmp->key==x && tmp->cnt>) return x; //【Attention】这句话非常重要,千万不要漏掉了!
if (tmp->key<x)
{
ans=max(tmp->key,ans);
tmp=tmp->rson;
}
else tmp=tmp->lson;
}
return ans;
} int suc(treap* &rt,int x)
{
int ans=INF;
treap *tmp=rt;
while (tmp)
{
if (tmp->key>x)
{
if (tmp->key==x && tmp->cnt>) return x;
ans=min(tmp->key,ans);//这里手滑写成了max(x,ans)orz
tmp=tmp->lson;
}
else tmp=tmp->rson;
}
return ans;
} int result()
{
int n,ans;
if(scanf("%d",&n) == EOF) n = ;
for (int i=;i<n;i++)
{
int turnover;
if(scanf("%d",&turnover) == EOF) turnover = ;
insert(root,turnover);
if (i==)
{
ans=turnover;
}
else
{
int premax,sucmin,ad=INF;
premax=pre(root,turnover);
sucmin=suc(root,turnover);
if (premax!=-INF && premax!=INF) ad=min(ad,turnover-premax);
if (sucmin!=INF && sucmin!=-INF) ad=min(ad,sucmin-turnover);
if (ad!=INF && ad!=-INF) ans=ans+ad;
}
}
return ans;
} int main()
{
printf("%d",result());
return ;
}
【Treap】BZOJ1588-[HNOI2002]营业额统计的更多相关文章
- bzoj1588 [HNOI2002]营业额统计(Treap)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 11485 Solved: 4062[Submit][Sta ...
- [BZOJ1588][HNOI2002]营业额统计 无旋Treap
[HNOI2002]营业额统计 时间限制: 5 Sec 内存限制: 162 MB 题目描述 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以 ...
- BZOJ1588: [HNOI2002]营业额统计[BST]
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 14151 Solved: 5366[Submit][Sta ...
- BZOJ1588 HNOI2002 营业额统计 [Splay入门题]
[HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 4128 Solved: 1305 Description 营业额统计 ...
- 【链表】BZOJ1588: [HNOI2002]营业额统计
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 17555 Solved: 7179[Submit][Sta ...
- BZOJ1588 [HNOI2002]营业额统计 splay模板
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 16189 Solved: 6482 [Submit][S ...
- bzoj1588: [HNOI2002]营业额统计(权值线段树)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 16863 Solved: 6789[Submit][Sta ...
- bzoj1588: [HNOI2002]营业额统计(splay)
1588: [HNOI2002]营业额统计 题目:传送门 题解: 复习splay所以来刷个水... 题目描述不是特别清楚:应该是找第i天以前一个最小的营业额和第i天做差的最小值作为第i天的最小波动值 ...
- [BZOJ1588] [HNOI2002] 营业额统计 (treap)
Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额. ...
- bzoj1588 [HNOI2002]营业额统计 (treap)
平衡树裸题 只需要求前驱后驱 treap写法 const mm=<<; maxnumber=; maxn=; var left,right,fix,key:..maxn]of longin ...
随机推荐
- android studio的弹出层
<activity android:name=".SecondActivity" android:theme="@style/Theme.AppCompat.Dia ...
- 旋转数组 [ LeetCode ]
原题地址:https://leetcode-cn.com/problems/rotate-array/description/ 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. ...
- C++ 中 string, char*, int 类型的相互转换
一.int 1.int 转换成 string 1) to_string函数 —— c++11标准增加了全局函数std::to_string: string to_string (int val); s ...
- linux 学习好资源
Linux-Wiki.cn http://linux-wiki.cn/wiki/zh-hans/Linux%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84 Linux目录 ...
- 关于MyBatis的collection集合中只能取到一条数据的问题
问题:在涉及多表查询的时候,使用collection元素来映射集合属性时,出现了只能查询到一条数据的情况,但用sql语句在数据库中查询会有多条记录. 解决:如果两表联查,主表和明细表的主键都是id的话 ...
- Round 0: Regionals 2010 :: NEERC Eastern Subregional
Round 0: Regionals 2010 :: NEERC Eastern Subregional 贴吧题解(官方)? 网上的题解 水 A Murphy's Law 题意:Anka拿着一块涂着黄 ...
- 随机洗牌算法Knuth Shuffle和错排公式
Knuth随机洗牌算法:譬如现在有54张牌,如何洗牌才能保证随机性.可以这么考虑,从最末尾一张牌开始洗,对于每一张牌,编号在该牌前面的牌中任意一张选一张和当前牌进行交换,直至洗到第一张牌为止.参考代码 ...
- POJ2154 Color
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10322 Accepted: 3360 Description Bead ...
- C++类学习
一.C++类的定义 C++中使用关键字 class 来定义类, 其基本形式如下:class 类名{ public: //行为或属性 protected: //行为或属性 private: / ...
- [TJOI2007]segment
题目描述 在一个 n*n 的平面上,在每一行中有一条线段,第 i 行的线段的左端点是(i, L(i)),右端点是(i, R(i)),其中 1 ≤ L(i) ≤ R(i) ≤ n. 你从(1, 1)点出 ...