题目描述

Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。

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

当最小波动值越大时,就说明营业情况越不稳定。

而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。

第一天的最小波动值为第一天的营业额。

输入输出格式

输入格式:

输入由文件’turnover.in’读入。

第一行为正整数n(n<=32767) ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数ai(|ai|<=1000000) ,表示第i天公司的营业额,可能存在负数。

输出格式:

输入输出样例

输入样例#1:

6
5
1
2
5
4
6
输出样例#1:

12

说明

结果说明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12

题目说的很清楚了,只是“第一天的最小波动值为第一天的营业额”这句话需要注意。那么,由于这题的特殊性,并不是最大值或最小值,而是最接近的,所以不适合用线段树等算法做。那用什么?BST是不错的选择。但是BST容易被卡啊,怎么办?写了个splay这个splay要用到的操作有Zig,Zag,splay,insert,searchpred,searchsucc。其他的不需要什么。splay这东西的精髓就是:频繁一点调用splay。还要注意的是,营业额有负数,还有0。。。

 #include<cstdio>
 #include<cstring>
 #include<algorithm>
 using namespace std;
 struct Splay{
     int Lid,Rid,val,fa;
 }T[];
 int ROOT,ans,n;
 int read(){
     ,f=; char ch=getchar();
     '){if (ch=='-') f=-f; ch=getchar();}
     +ch-',ch=getchar();
     return x*f;
 }
 void Insert(int x,int v,int cnt,int ff){
     <<)){T[x].val=v; T[x].fa=ff; return;}
     if (v<T[x].val){
         if (!T[x].Lid) T[x].Lid=cnt; Insert(T[x].Lid,v,cnt,x);
     }else{
         if (!T[x].Rid) T[x].Rid=cnt; Insert(T[x].Rid,v,cnt,x);
     }
 }
 int Search_Succ(int x){
     if (T[x].Rid){
         for (int y=T[x].Rid; y; y=T[y].Lid) if (!T[y].Lid) return T[y].val;
     }<<);
 }
 int Search_Pred(int x){
     if (T[x].Lid){
         for (int y=T[x].Lid; y; y=T[y].Rid) if (!T[y].Rid) return T[y].val;
     }<<);
 }
 void Zig(int x){
     int y=T[x].fa; T[y].Lid=T[x].Rid;
     if (T[x].Rid) T[T[x].Rid].fa=y;
     T[x].fa=T[y].fa;
     if (T[y].fa){
         if (y==T[T[y].fa].Lid) T[T[y].fa].Lid=x; else T[T[y].fa].Rid=x;
     }
     T[y].fa=x,T[x].Rid=y;
 }
 void Zag(int x){
     int y=T[x].fa; T[y].Rid=T[x].Lid;
     if (T[x].Lid) T[T[x].Lid].fa=y;
     T[x].fa=T[y].fa;
     if (T[y].fa){
         if (y==T[T[y].fa].Lid) T[T[y].fa].Lid=x; else T[T[y].fa].Rid=x;
     }
     T[y].fa=x,T[x].Lid=y;
 }
 void splay(int x){
     for (int y=T[x].fa; y; y=T[x].fa){
         if (!T[y].fa){if (x==T[y].Lid) Zig(x); else Zag(x); break;}
         if (x==T[y].Lid){
             if (y==T[T[y].fa].Lid) Zig(y),Zig(x); else Zig(x),Zag(x);
         }else{
             if (y==T[T[y].fa].Rid) Zag(y),Zag(x); else Zag(x),Zig(x);
         }
     }
     ROOT=x;
 }
 int main(){
     memset(T,,;
     n=read(); ; i<=n; i++) T[i].val=-(<<);
     T[].val=read(),ans=T[].val;
     ; i<=n; i++){
         int x=read();
         Insert(ROOT,x,i,); splay(i);
         int suc=Search_Succ(i),pre=Search_Pred(i);
         ans+=min(abs(suc-x),abs(pre-x));
     }
     printf("%d",ans);
     ;
 }

Ps:C党还可用STL里面的set实现(代码短小而精悍)。

[HNOI2002] 营业额统计的更多相关文章

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

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 14151  Solved: 5366[Submit][Sta ...

  2. BZOJ 1588: [HNOI2002]营业额统计

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 14396  Solved: 5521[Submit][Sta ...

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

    1588: [HNOI2002]营业额统计 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger ...

  4. BZOJ1588 HNOI2002 营业额统计 [Splay入门题]

    [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4128  Solved: 1305 Description 营业额统计 ...

  5. bzoj 1588: [HNOI2002]营业额统计 treap

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 13902  Solved: 5225[Submit][Sta ...

  6. 数据结构:(平衡树,链表)BZOJ 1588[HNOI2002]营业额统计

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 12173  Solved: 4354[Submit][Sta ...

  7. bzoj1588 [HNOI2002]营业额统计(Treap)

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 11485  Solved: 4062[Submit][Sta ...

  8. 1588: [HNOI2002]营业额统计

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 9203  Solved: 3097[Submit][Stat ...

  9. 【链表】BZOJ1588: [HNOI2002]营业额统计

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 17555  Solved: 7179[Submit][Sta ...

  10. [HNOI2002]营业额统计_Treap

    [HNOI2002]营业额统计 题目大意:给你一串n数序列,对于每一个刚输入的数a,找到一个前面的数k,使得|a-k|最小. 注释:$n<=32767,ai<=10^6$. 想法:刚学Tr ...

随机推荐

  1. Leetcode_Easy_14

    编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". class Solution { public String longestCommonP ...

  2. POJ 3415 Common Substrings(长度不小于K的公共子串的个数+后缀数组+height数组分组思想+单调栈)

    http://poj.org/problem?id=3415 题意:求长度不小于K的公共子串的个数. 思路:好题!!!拉丁字母让我Wa了好久!!单调栈又让我理解了好久!!太弱啊!! 最简单的就是暴力枚 ...

  3. Js 运行机制 (重点!!)

    一.引子 本文介绍JavaScript运行机制,这一部分比较抽象,我们先从一道面试题入手: 这一题看似很简单,但如果你不了解JavaScript运行机制,很容易就答错了.题目的答案是依次输出1 2 3 ...

  4. Codeforces Round #200 (Div. 1) D. Water Tree 树链剖分+线段树

    D. Water Tree time limit per test 4 seconds memory limit per test 256 megabytes input standard input ...

  5. 解決 Android Studio 不停 Indexing 的問題(Updating Indices: Indexing paused due to batch update)

    遇到這個問題通常是 IDE 更新後,或是反覆使用 Android Studio 開啟其他專案所導致,解決方法其實非常簡單喔! 点击 這個選項的功用是「清除 IDE 暫存並重啟」,沒錯,會出現上述情形的 ...

  6. python 比较两个yaml文件

    import yaml with open("a.yaml") as f: with open("a.yaml") as k: ): x=f.readline( ...

  7. Eclispe中编辑xml配置文件时不会提示也不能自动调整格式

    创建了一个xml文件后,发现编辑起来和原来的那些有所不同,不会提示补全.也不能自动调整格式???woc? 哈哈哈哈哈,“我最恨你像个石头一样” 后来发现是编辑器被改了!!! 右键xml文件然后open ...

  8. Dragger2好网文整合

    Dagger2从入门到放弃再到恍然大悟 详解Dagger2 http://blog.csdn.net/u012124438/article/details/52505986

  9. 学习笔记57—归一化 (Normalization)、标准化 (Standardization)和中心化/零均值化 (Zero-centered)

    1 概念   归一化:1)把数据变成(0,1)或者(1,1)之间的小数.主要是为了数据处理方便提出来的,把数据映射到0-1范围之内处理,更加便捷快速.2)把有量纲表达式变成无量纲表达式,便于不同单位或 ...

  10. 学习笔记23—window10 64位 python2.7 安装liblinear

    最近在使用pythin,因为要使用libsvm,所以到官网去下载libsvm.官网地址为libsvm(https://www.csie.ntu.edu.tw/~cjlin/libsvm/)结果下载下来 ...