洛谷p2234/BZOJ1588 [HNOI2002]营业额统计
分析:###
好像没有什么好说的就是一个平衡树的板子……唯一要注意的就是这里要找的并不是严格的前驱和后继,因为如果找到之前某一天的营业额和它相等那么差就是0,所以我们仍然在结构体中开一个域cnt来存储同一个元素存储了多少次,如果a[p].cnt>1说明这个元素已经出现了不止一次了,那么直接跳出循环,返回a[p].val即可。
这一段代码贴在这里:
if(val==a[p].val){
if(a[p].cnt>1){
ans=p;
break;
}
...
}
然后说一下我的沙雕错误……建树的时候手一抽在左子树上压了个INF,在右子树上压了个-INF,然后敲敲打打找了两个小时的bug……
对于这件事我只想说:妈的智障!
全部代码如下:
#include<bits/stdc++.h>
#define maxn 40000
using namespace std;
struct treap{
int val;int l,r;int dat;int size;int cnt;
}a[maxn];
int tot,root,n,inf=0x7fffffff,ans=0;
inline int read(){
int cn=0,f=1;char c;
c=getchar();
while(!isdigit(c)){
if(c=='-')f=-1;
c=getchar();
}
while(isdigit(c)){
cn=cn*10+c-'0';
c=getchar();
}
return cn*f;
}
inline int New(int val){
a[++tot].val=val;
a[tot].dat=rand();
a[tot].cnt=a[tot].size=1;
return tot;
}
inline void update(int p){
a[p].size=a[a[p].l].size+a[a[p].r].size+a[p].cnt;
}
inline void build_tree(){
New(-inf),New(inf);
root=1;a[1].r=2;
update(root);
}
void zig(int &p){
int q=a[p].l;
a[p].l=a[q].r,a[q].r=p,p=q;
update(a[p].r),update(p);
}
void zag(int &p){
int q=a[p].r;
a[p].r=a[q].l,a[q].l=p,p=q;
update(a[p].l),update(p);
}
void insert(int &p,int val){
if(p==0){
p=New(val);
return;
}
if(val==a[p].val){
a[p].cnt++,update(p);
return;
}
if(val<a[p].val){
insert(a[p].l,val);
if(a[p].dat<a[a[p].l].dat)zig(p);
}
else{
insert(a[p].r,val);
if(a[p].dat<a[a[p].r].dat)zag(p);
}
update(p);
}
int get_pre(int val){
int ans=1;//a[1].val==-inf
int p=root;
while(p){
if(val==a[p].val){
if(a[p].cnt>1){
ans=p;
break;
}
if(a[p].l>0){
p=a[p].l;
while(a[p].r>0)p=a[p].r;
ans=p;
}
break;
}
if(a[p].val<val&&a[p].val>a[ans].val) ans=p;
p=val<a[p].val?a[p].l:a[p].r;
}
return a[ans].val;
}
int get_next(int val){
int ans=2;// a[2].val==inf
int p=root;
while(p){
if(val==a[p].val){
if(a[p].cnt>1){
ans=p;
break;
}
if(a[p].r>0){
p=a[p].r;
while(a[p].l>0)p=a[p].l;
ans=p;
}
break;
}
if(a[p].val>val&&a[p].val<a[ans].val) ans=p;
p=val<a[p].val?a[p].l:a[p].r;
}
return a[ans].val;
}
int main(){
// freopen("turnover.in","r",stdin);
// freopen("turnover.out","w",stdout);
n=read();
build_tree();
srand(19260817);
for(register int i=1;i<=n;i++){
int x;
x=read();
insert(root,x);
if(i==1)
ans+=x;
else{
if(get_pre(x)==-inf){
ans+=get_next(x)-x;
continue;
}
if(get_next(x)==inf){
ans+=x-get_pre(x);
continue;
}
ans+=min(x-get_pre(x),get_next(x)-x);
}
// cout<<ans<<endl;
}
printf("%d",ans);
return 0;
}
洛谷p2234/BZOJ1588 [HNOI2002]营业额统计的更多相关文章
- 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]营业额统计(Treap)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 11485 Solved: 4062[Submit][Sta ...
- 【链表】BZOJ1588: [HNOI2002]营业额统计
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 17555 Solved: 7179[Submit][Sta ...
- [BZOJ1588][HNOI2002]营业额统计 无旋Treap
[HNOI2002]营业额统计 时间限制: 5 Sec 内存限制: 162 MB 题目描述 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以 ...
- 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拿出了公司的账本,账本上记录了公司成立以来每天的营业额. ...
随机推荐
- Hibernate Jar包官方下载
1.新手入门,从官网下载Hibernate,选择 Hibernate ORM 2.选择Releases-Overview 3.上面列出的是最新版本,下面有一个see older series 直接下载 ...
- Java-JDK-bin-Java-JR
Java in JDK\bin vs. Java in JRE\bin (Java in General forum at Coderanch) https://coderanch.com/t/385 ...
- axis、xfire、CXF 、JWS
1.JWS是Java语言对WebService服务的一种实现,用来开发和发布服务.而从服务本身的角度来看JWS服务是没有语言界限的.但是Java语言为Java开发者提供便捷发布和调用WebServic ...
- LCS的几种求法
\(LCS:\) 对于两个长度均为 \(N\) 的数列 \(A\) 和 \(B\) ,存在一个数列 \(C\) 使得 \(C\) 既是 \(A\) 的子序列有事 \(B\) 的子序列,现在需要求这个数 ...
- HDU 6122 今夕何夕 【数学公式】 (2017"百度之星"程序设计大赛 - 初赛(A))
今夕何夕 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- django rest_framework swagger使用案例
环境准备 环境要求: python3 django2 pip3 模块安装: pip3 install django-rest-framework pip3 install django-rest-sw ...
- 如何修改织梦dedecms文章标题的最大长度
织梦dedecms默认的文章标题的最大长度为60字节,如果文章标题超过60字节将会自动截断,导致标题显示不全,这并非是我们所希望的.那么如何将标题长度改成我们想要的?只需简单两步即可解决问题. 1.进 ...
- 星星dom
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>星星&l ...
- Scanner、String(java基础知识十二)
1.Scanner的概述和方法介绍 * A:Scanner的概述 * 是一个从键盘输入的类,有final修饰,不能被子类继承 * Scanner sc = new Scanner(System.in) ...
- sublime text 3 安装vue 语法插件
1.下载https://github.com/vuejs/vue-syntax-highlight,点击这里也可以下载压缩包 2.解压到C:\Users\***\AppData\Roaming\Sub ...