BZOJ 1588 (treap)
题面
分析
语文题,主要是如何理解最小波动值
设当前天的营业额为x,则最小波动值为min(x-最大的<=x的数,最小的>=x的数-x)
然后用Treap维护序列就可以了
时间复杂度 $ O(n \log n) $
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define lson tree[p].l
#define rson tree[p].r
#define INF 0x3f3f3f3f
#define maxn 100005
using namespace std;
int n;
struct node{
int l;
int r;
int cnt;
int size;
int val;
int dat;
}tree[maxn];
int tot=0;
int root;
int New(int val){
tree[++tot].cnt=1;
tree[tot].size=1;
tree[tot].val=val;
tree[tot].dat=rand();
return tot;
}
void update(int p){
tree[p].size=tree[lson].size+tree[rson].size+tree[p].cnt;
}
void build(){
New(-INF);
New(INF);
root=1;
tree[1].r=2;
update(root);
}
void zig(int &p){
int q=tree[p].l;
tree[p].l=tree[q].r;
tree[q].r=p;
p=q;
update(tree[p].r);
update(p);
}
void zag(int &p){
int q=tree[p].r;
tree[p].r=tree[q].l;
tree[q].l=p;
p=q;
update(tree[p].l);
update(p);
}
void insert(int &p,int val){
if(p==0){
p=New(val);
return;
}
if(tree[p].val==val){
tree[p].cnt++;
update(p);
return;
}
if(val<tree[p].val){
insert(lson,val);
if(tree[p].dat<tree[lson].dat) zig(p);
}else{
insert(rson,val);
if(tree[p].dat<tree[rson].dat) zag(p);
}
update(p);
}
int get_rank_by_val(int p,int val){
if(p==0) return 0;
if(tree[p].val==val) return tree[lson].size+1;
else if(val<tree[p].val){
return get_rank_by_val(lson,val);
}else{
return tree[lson].size+tree[p].cnt+get_rank_by_val(rson,val);
}
}
int get_val_by_rank(int p,int rank){
if(p==0) return INF;
if(tree[lson].size>=rank) return get_val_by_rank(lson,rank);
if(tree[lson].size+tree[p].cnt>=rank) return tree[p].val;
return get_val_by_rank(rson,rank-tree[lson].size-tree[p].cnt);
}
int main(){
long long ans=0;
int x,rk,low,up;
build();
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&x);
insert(root,x);
if(i==1) ans+=x;
else{
rk=get_rank_by_val(root,x);
low=get_val_by_rank(root,rk-1);
up=get_val_by_rank(root,rk+1);
ans+=min(abs(x-low),abs(x-up));
}
}
printf("%lld\n",ans);
}
BZOJ 1588 (treap)的更多相关文章
- BZOJ 1588: Treap 模板
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 12171 Solved: 4352 Description ...
- BZOJ 1588: [HNOI2002]营业额统计 双向链表
BZOJ 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 9619 Solved: 3287 题目连接 ht ...
- BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap
1588: [HNOI2002]营业额统计 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger ...
- bzoj 1588: [HNOI2002]营业额统计 treap
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 13902 Solved: 5225[Submit][Sta ...
- 2018.07.06 BZOJ 1588: HNOI2002营业额统计(非旋treap)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Description 营业额统计 Tiger最近被公司升任为营业部经理,他上 ...
- 【BZOJ 1588】[HNOI2002] 营业额统计(Treap)
Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...
- BZOJ 1588 HNOI2002 营业额统计 裸Treap
题目大意:...题目描写叙述不全看这里好了 给定一个序列 对于每一个元素我们定义该数的最小波动值为这个数与前面全部数的差中的最小值(第一个数的最小波动值为第一个数本身) 求最小波动值之和 找近期的数仅 ...
- BZOJ 1588: [HNOI2002]营业额统计
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 14396 Solved: 5521[Submit][Sta ...
- BZOJ 1588:营业额统计(Splay)
http://www.lydsy.com/JudgeOnline/problem.php?id=1588 题意:中文题意. 思路:每一个点每一个点插入Splay,然后插入新的一个点之后,查这个节点的前 ...
随机推荐
- HBase的访问方式
这里只介绍三种最常用的方式 1.HBase shell HBase的命令行工具是最简单的接口,主要用于HBase管理 首先启动HBase 帮助 hbase(main):001:0> help 查 ...
- jQuery学习总结01-选择器
下面简单介绍一个常用的jQuery使用方法,其他详细的猛戳这里 一.选择器 1.parent > child 说明:在给定父类的情况下匹配所有的子类 示例: 描述:匹配表单中所有的的子级inpu ...
- Maya2017下载安装与激活
目录 1. 更多推荐 2. 下载地址 2.1. OneDrive 2.2. 百度云 3. 安装激活步骤 1. 更多推荐 其他Maya版本的下载与激活:https://www.cnblogs.com/c ...
- linux NFS 客户端的安装
1. 安装 showmount [root@allentuns ~]# yum -y install showmount 2. 查看服务器共享 [root@allentuns ~]# showmoun ...
- opencv windows源码编译
WITH_QT//H:\software\programming\qt\5.12.3\mingw73_32\lib\cmake 5.6的路径要改这样 WITH_OPENGL 编译器mingw32-m ...
- golang API
1.server端程序 package main //简单的JSON Restful API演示(服务端) //author: Xiong Chuan Liang //date: 2015-2-28 ...
- LOJ 2840「JOISC 2018 Day 4」糖
有趣的脑子题(可惜我没有脑子 好像也可以称为模拟费用流(? 我们考虑用链表维护这个东西 再把贡献扔到堆里贪心就好了 大概就是类似于有反悔机制的贪心?我们相当于把选中的一个打上一个-v的tag然后如果选 ...
- C++创建对象时什么时候用*,什么时候不用*
用*, 表示创建的是一个指针对象,而指针的创建,必须初始化,C++中用new关键字开辟内存. 另外指针对象访问成员变量用-> , 非指针用. 就这么个原则 但是指针也可以不用-> 例如 ( ...
- cordova+vue做的app解决引入cordova-plugin-splashscreen后启动先显示黑屏在显示启动页
先上项目目录结构cordova项目结构 android platform 结构 图中用红框框起来的为主要修改文件 这篇主要的讲cordova项目引用了cordova-plugin-splashscre ...
- 刷leetcode之路
写的不是很好,仅记录自己所写的,仅供参考. 第七题: Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = ...