日常[splay]:水题记——营业额统计
没错这就是让我深陷splay之中的罪魁祸首,昨天打了一下午结果发现是玄学错误的那个
人生第一棵splay平衡树
题目大意:求一段序列,小于当前元素的最大值和大于当前元素的最小值。从该元素前面的元素找。(颓的别人的概括)
题解:
几乎是splay裸题了。
只需要注意一下本身,加一个特判:插入前cnt不为零或者是插入后cnt大于1。(不知道为啥,前者跑了900毫,后者只需要100毫……)
然后我就顺手写了一个小函数判定(其实就是找到该数字对应的下标)
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
struct ing{
int fa,ch[2],data,cnt,size;
}t[200003];
int tot=0,n,dy,root=0,ans=0;
inline void rotate(int x)
{
int y=t[x].fa;
int z=t[y].fa;
int k=t[y].ch[1]==x;
t[x].fa=z;
t[z].ch[t[z].ch[1]==y]=x;
t[y].ch[k]=t[x].ch[k^1];
t[t[x].ch[k^1]].fa=y;
t[x].ch[k^1]=y;
t[y].fa=x;
}
inline void splay(int x,int goal)
{
while(t[x].fa!=goal)
{
int y=t[x].fa;
int z=t[y].fa;
if(z!=goal)
(x==t[y].ch[0])^(y==t[z].ch[0])?rotate(x):rotate(y);
rotate(x);
}
if(goal==0)root=x;
}
inline void find(int x)
{
int u=root;
if(!u)return ;
while(t[u].ch[x>t[u].data]&&t[u].data!=x)
u=t[u].ch[x>t[u].data];
splay(u,0);
}
inline void insert(int x)
{
int u=root,ff=0;
while(u&&t[u].data!=x)
{
ff=u;
u=t[u].ch[x>t[u].data];
}
if(u) t[u].cnt++;
else
{
u=++tot;
if(ff) t[ff].ch[x>t[ff].data]=u;
t[u].ch[0]=t[u].ch[1]=0;
t[tot].fa=ff;
t[tot].data=x;
t[tot].cnt=1;
t[tot].size=1;
}
splay(u,0);
}
inline int nxt(int x,int f)
{
find(x);
int u=root;
if(t[u].data>x&&f)return u;
if(t[u].data<x&&!f)return u;
u=t[u].ch[f];
while(t[u].ch[f^1])u=t[u].ch[f^1];
return u;
}
inline int dre(int x)
{
int u=root;
while(u&&t[u].data!=x)
u=t[u].ch[x>t[u].data];
return u;
}
int main()
{
// freopen("data.in","r",stdin);
scanf("%d",&n);scanf("%d",&dy);
insert(inf),insert(-inf);
ans+=dy;
insert(dy);
for(register int i=2;i<=n;++i)
{
if(scanf("%d",&dy)==-1)dy=0;
insert(dy);
if(t[dre(dy)].cnt>1) continue;
// cout<<t[nxt(dy,0)].data<<" "<<t[nxt(dy,1)].data<<endl;
ans+=min(abs(t[nxt(dy,0)].data-dy),abs(dy-t[nxt(dy,1)].data));
}
printf("%d\n",ans);
return 0;
}
P.S.学习splay推荐https://blog.csdn.net/qq_30974369/article/details/77587168,大佬讲的好清楚(就是留坑没有补,少rank操作)
日常[splay]:水题记——营业额统计的更多相关文章
- 【BZOJ-1588】营业额统计 Splay
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 12485 Solved: 4508[Submit][Sta ...
- bzoj1588: [HNOI2002]营业额统计(splay)
1588: [HNOI2002]营业额统计 题目:传送门 题解: 复习splay所以来刷个水... 题目描述不是特别清楚:应该是找第i天以前一个最小的营业额和第i天做差的最小值作为第i天的最小波动值 ...
- NOI 2002 营业额统计 (splay or fhq treap)
Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...
- BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap
1588: [HNOI2002]营业额统计 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger ...
- Splay树-Codevs 1296 营业额统计
Codevs 1296 营业额统计 题目描述 Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司 ...
- BZOJ1588 HNOI2002 营业额统计 [Splay入门题]
[HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 4128 Solved: 1305 Description 营业额统计 ...
- NOIP 营业额统计 splay tree 纯模板
2924: 营业额统计 Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByteTotal Submit: 389 ...
- 1588: [HNOI2002]营业额统计 (splay tree)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 5783 Solved: 1859[Submit][Stat ...
- 1588. [HNOI2002]营业额统计【平衡树-splay 或 线段树】
Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...
随机推荐
- Ruby 类的创建
class Language def initialize(name, creator) @name = name @creator = creator end def description pu ...
- bzoj 1477: 青蛙的约会【exgcd】
列出式子是\( mx+s1\equiv nx+s2(mod L) (m-n)x+Ly=s2-s1 \),注意如果n-m<0的话,就把ac都乘-1变成正数,然后exgcd求解,最后注意x为负的话要 ...
- RobotFramework自动化测试框架(1)- RobotFramework简介
对于RobotFramework自动化测试框架,我这里会从三个单元进行阐述,希望能对你有帮助. RobotFramework简介 RobotFramework是什么? Robotframework 是 ...
- Codeforces Round #542(Div. 2) D1.Toy Train
链接:https://codeforces.com/contest/1130/problem/D1 题意: 给n个车站练成圈,给m个糖果,在车站上,要被运往某个位置,每到一个车站只能装一个糖果. 求从 ...
- 递推DP URAL 1244 Gentlemen
题目传送门 /* 题意:给出少了若干卡片后的总和,和原来所有卡片,问少了哪几张 DP:转化为少了的总和是否能有若干张卡片相加得到,dp[j+a[i]] += dp[j]; 记录一次路径,当第一次更新的 ...
- 转 做了两款数据库监控工具(mysql and nosql),打算在近期开源
http://www.cnblogs.com/leefreeman/p/7297549.html 监控指标:https://www.linuxidc.com/Linux/2015-08/122009. ...
- (023) 关于51单片机的A5指令
可看见一篇讲51单片机加密的文章这么讲: [加密方法:在A5后加一个二字节或三字节操作码,因为所有反汇编软件都不会反汇编A5指令,造成正常程序反汇编乱套,执行程序无问题仿制者就不能改变你的源程序.] ...
- Solr打分排序规则自定义【转】
在搭建好solrCloud搜索集群后,通过编写基本的查询显示语句已经能够通过输入关键字查询到相应结果进行显示,但是在显示结果排序上以及不相关信息过滤问题上,如何制定合理的打分规则得到理想的结果集确实比 ...
- qconbeijing2016
http://2016.qconbeijing.com/schedule 大会日程 2016年04月21日 星期四 09:15 开场致辞 地点 1号厅 主题演讲 工程效率提升 业务核心架构 容器集 ...
- 【ADO.NET】 基础 (SQL Server)
一.Web.config配置 <connectionStrings> <add name="constr_name" connectionString=" ...