洛谷:P2234 [HNOI2002]营业额统计

原题地址: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;
} 

原文地址:https://www.cnblogs.com/yyy2015c01/p/8481619.html

时间: 2024-10-12 20:52:23

洛谷:P2234 [HNOI2002]营业额统计的相关文章

洛谷P2234 [HNOI2002]营业额统计

题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题.经济管理学上定义了一种最小波动值来衡量这种情况: 当最小波动值越大时,就说明营业情况越不稳定. 而分析整个公司

P2234 [HNOI2002]营业额统计 (权值线段树)

P2234 [HNOI2002]营业额统计 题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题.经济管理学上定义了一种最小波动值来衡量这种情况: 当最小波动值越大

luogu P2234 [HNOI2002]营业额统计

二次联通门 : luogu P2234 [HNOI2002]营业额统计 /* luogu P2234 [HNOI2002]营业额统计 splay 每次插入一个数 查询它的前驱与后继 有两点需要注意 1.大部分的数据有误..即输入的数据不够.. 2.判断前驱后继是否存在 3.注意判断该数是否已出现过 */ #include <cstdio> #define Max 50000 #define INF 1e8 namespace Z { inline int min (int a, int b)

P2234 [HNOI2002]营业额统计(50分。。。。)

50 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define N 50007 #define inf 0x7fffffff using namespace std; int n,a[N],d[N],ans; struct Data { int x,ord; }data[N]; struct tree { int l,r,mn,mx,sum; }tr[N

BZOJ 1588: [HNOI2002]营业额统计

1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 14396  Solved: 5521[Submit][Status][Discuss] Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其

HNOI2002营业额统计(平衡树)

标准的平衡树. 贴个splay吧 var v,l,r,fa:array[0..100000] of longint; root,x,i,n,ans:longint; procedure zig(x:longint); var y,z:longint; begin y:=fa[x];z:=fa[y]; if root=y then root:=x; l[y]:=r[x]; if r[x]<>0 then fa[r[x]]:=y; r[x]:=y; fa[y]:=x; fa[x]:=z; if z

BZOJ 题目1588: [HNOI2002]营业额统计(Splay Tree 求前驱后继)

1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 10828  Solved: 3771 [Submit][Status][Discuss] Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者

BZOJ1588: [HNOI2002]营业额统计[BST]

1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 14151  Solved: 5366[Submit][Status][Discuss] Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其

BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap

1588: [HNOI2002]营业额统计 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题.经济管理学上定义了一种最小波动值来衡量这