关键词:
原题地址:https://www.luogu.org/problemnew/show/P2234
题目简述
给定一个序列,对于每一个数都要查询:序列中在这个数前与这个数最接近的数是什么?然后将最接近的数字与这个数字的差累加。(序列第一个数字直接加自己)
思路
查询在这个数之前与这个数最接近的数,我们很容易想到用二叉搜索树(BST)来做。
虽然数据略水暴力排序每次查询从一个数往左右找也能过。
每次插入一个数字,然后查询,我用Treap实现(还是弱化版的,只有插入查询)。
Treap的核心其实就是打乱顺序插入防止被卡(粗糙理解)。具体实现方法不难,请百度。(我之后会写一篇专门介绍下各种BST的。)
PS:Treap树完整版之后写。这题用STL的vector也行,vector理论每次插入渐进时间复杂度是O(n)但是听说实际是对数级别的?
代码
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
inline int randad()
static int seed=114; //seed可以随便取
return seed=int(seed*48271LL%2147483647);//48271使得其有完全周期,即2147483647内取遍不重复
struct Treap
int key,pri,son[2];
T[33333];
int cnt=1,rt=0;
void rotate(int p,int &rt)
int y=T[rt].son[p];
T[rt].son[p]=T[y].son[!p];
T[y].son[!p]=rt;
rt=y;
void ins(int key,int &rt)
if(rt==0)
T[rt=cnt++] = (Treap)key,randad();
else
int p=key>T[rt].key;
ins(key,T[rt].son[p]);
if(T[T[rt].son[p]].pri>T[rt].pri)
rotate(p,rt);
int nowMin(int key,int rt)//查询现在最接近key的数
if(rt==0) return 666666666;
int res=abs(key-T[rt].key);
if(key>T[rt].key) res=min(res,nowMin(key,T[rt].son[1]));
else if(key<T[rt].key) res=min(res,nowMin(key,T[rt].son[0]));
return res;
int n,tot=0;
int main()
scanf("%d",&n);
for (int i=1;i<=n;i++)
int num;
scanf("%d",&num);
if (i==1) tot+=num;
else tot+=nowMin(num,rt);//rt是当前根
ins(num,rt);
printf("%d",tot);
return 0;
p2234[hnoi2002]营业额统计(权值线段树)
P2234[HNOI2002]营业额统计题目描述Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情... 查看详情
p2234[hnoi2002]营业额统计(50分。。。。)
50#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#defineN50007#defineinf0x7fffffffusingnamespacestd;intn,a[N],d[N],ans;structData{intx,ord;}data[N];struc 查看详情
洛谷2234bzoj1588hnoi2002营业额统计
【题解】 treap模板题,直接用Treap维护前驱、后继,每次找到更接近当前val的加上就好了。1#include<cstdio>2#include<algorithm>3#definels(a[u].l)4#definers(a[u].r)5#defineLLlonglong6usingnamespacestd;7constintmaxn=200010;8intn,k 查看详情
luogup2234[hnoi2002]营业额统计
二次联通门: luoguP2234[HNOI2002]营业额统计 /*luoguP2234[HNOI2002]营业额统计splay每次插入一个数查询它的前驱与后继有两点需要注意1.大部分的数据有误。。即输入的数据不够。。2.判断前驱后继是否存在3.注意判断该数... 查看详情
bzoj1588:[hnoi2002]营业额统计
1588:[HNOI2002]营业额统计TimeLimit: 5Sec MemoryLimit: 162MBSubmit: 14396 Solved: 5521[Submit][Status][Discuss]Description营业额统计Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是 查看详情
hnoi2002营业额统计
P1287-【HNOI2002】营业额统计DescriptionTiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业... 查看详情
链表bzoj1588:[hnoi2002]营业额统计
1588:[HNOI2002]营业额统计TimeLimit:5Sec MemoryLimit:162MBSubmit:17555 Solved:7179[Submit][Status][Discuss]Description营业额统计Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营... 查看详情
[hnoi2002]营业额统计
[HNOI2002]营业额统计 题目大意:给你一串n数序列,对于每一个刚输入的数a,找到一个前面的数k,使得|a-k|最小。 注释:$n<=32767,ai<=10^6$。 想法:刚学Treap。这道算Treap的练习题里吧,对于新手... 查看详情
bzoj1588:[hnoi2002]营业额统计
1588:[HNOI2002]营业额统计TimeLimit:5Sec??MemoryLimit:162MBDescription营业额统计Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。Tiger拿出了公司的账本,账本上记录了公司成... 查看详情
[hnoi2002]营业额统计
...62MBSubmit:15956 Solved:6358[Submit][Status][Discuss]Description营业额统计Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。Tiger拿出了公司的账本,账本上记录了公司... 查看详情
bzoj1588[hnoi2002]营业额统计
1588:[HNOI2002]营业额统计Description营业额统计Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分... 查看详情
bzoj1588:[hnoi2002]营业额统计treap
1588:[HNOI2002]营业额统计TimeLimit: 5Sec MemoryLimit: 162MBSubmit: 13902 Solved: 5225[Submit][Status][Discuss]Description营业额统计Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是 查看详情
bzoj1588:[hnoi2002]营业额统计[bst]
1588:[HNOI2002]营业额统计TimeLimit: 5Sec MemoryLimit: 162MBSubmit: 14151 Solved: 5366[Submit][Status][Discuss]Description营业额统计Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是 查看详情
bzoj1588[hnoi2002]营业额统计treap
1588:[HNOI2002]营业额统计TimeLimit: 5Sec MemoryLimit: 162MBSubmit: 17740 Solved: 7298[Submit][Status][Discuss]Description营业额统计Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是 查看详情
[bzoj1588][hnoi2002]营业额统计
[BZOJ1588][HNOI2002]营业额统计试题描述营业额统计Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额... 查看详情
bzoj1588[hnoi2002]营业额统计splay模板
1588:[HNOI2002]营业额统计TimeLimit:5Sec MemoryLimit:162MBSubmit:16189 Solved:6482[Submit][Status][Discuss]Description营业额统计Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营... 查看详情
bzoj1588:[hnoi2002]营业额统计(代码片段)
1588:[HNOI2002]营业额统计TimeLimit: 5Sec MemoryLimit: 162MBDescription营业额统计Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。Tiger拿出了公司的账本,账... 查看详情
[luogup2234][hnoi2002]营业额统计
[luoguP2234][HNOI2002]营业额统计题目描述Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营... 查看详情