营业额统计

Time Limit:5000MS     Memory Limit:165888KB     64bit IO Format:%lld & %llu

Submit Status

Description

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

Input

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

Output

输出文件仅有一个正整数,即Sigma(每天最小的波动值) 。结果小于2^31 。

Sample Input

6
5
1
2
5
4
6

Sample Output

12

初学伸展树,先借鉴了他人的模板
  1 //2016.8.12
  2 #include<iostream>
  3 #include<cstdio>
  4 #include<algorithm>
  5
  6 using namespace std;
  7
  8 const int N = 100005;
  9 const int inf = 0x3f3f3f3f;
 10 int root , tot, pre[N], key[N], child[N][2];//分别表示根节点、节点总数、父节点、键值、孩子(左0右1)
 11
 12 void NewNode(int &r, int father, int k)//创建新节点
 13 {
 14     r = ++tot;
 15     pre[r] = father;
 16     key[r] = k;
 17     child[r][0] = child[r][1] = 0;//叶子节点,孩子为空
 18 }
 19
 20 void Rotato(int x, int kind)//旋转,kind为1则右旋,为0则左旋
 21 {
 22     int y = pre[x];
 23     child[y][!kind] = child[x][kind];
 24     pre[child[x][kind]] = y;
 25     if(pre[y])
 26       child[pre[y]][child[pre[y]][1]==y] = x;
 27     pre[x] = pre[y];
 28     child[x][kind] = y;
 29     pre[y] = x;
 30 }
 31
 32 void Splay(int r, int goal)//Splay调整,将r节点调到goal节点下面
 33 {
 34     while(pre[r] != goal)
 35     {
 36         if(pre[pre[r]]==goal)
 37           Rotato(r, child[pre[r]][0]==r);
 38         else
 39         {
 40             int y = pre[r];
 41             int kind = child[pre[y]][0]==y;
 42             if(child[y][kind] == r)
 43             {
 44                 Rotato(r, !kind);
 45                 Rotato(r, kind);
 46             }else
 47             {
 48                 Rotato(y, kind);
 49                 Rotato(r, kind);
 50             }
 51         }
 52     }
 53     if(goal == 0)root = r;//更新根节点
 54 }
 55
 56 int ins(int k)//插入
 57 {
 58     int r = root;
 59     while(child[r][key[r]<k])
 60     {
 61         if(key[r] == k)//不重复插入
 62         {
 63             Splay(r, 0);
 64             return 0;
 65         }
 66         r = child[r][key[r]<k];
 67     }
 68     NewNode(child[r][key[r]<k], r, k);
 69     Splay(child[r][key[r]<k], 0);
 70     return 1;
 71 }
 72
 73 int get_pre(int x)//找前驱
 74 {
 75     int tmp = child[x][0];
 76     if(tmp==0)return inf;
 77     while(child[tmp][1])
 78     {
 79         tmp = child[tmp][1];
 80     }
 81     return key[x]-key[tmp];
 82 }
 83
 84 int get_next(int x)//找后继
 85 {
 86     int tmp = child[x][1];
 87     if(tmp==0)return inf;
 88     while(child[tmp][0])
 89     {
 90         tmp = child[tmp][0];
 91     }
 92     return key[tmp]- key[x];
 93 }
 94
 95 int main()
 96 {
 97     int n, ans, num;
 98     while(cin>>n)
 99     {
100         root = tot = ans = 0;
101         for(int i = 0; i < n; i++)
102         {
103             scanf("%d", &num);
104             if(i==0)
105             {
106                 ans+=num;
107                 NewNode(root, 0, num);
108                 continue;
109             }
110             if(ins(num)==0)continue;
111             int l = get_pre(root);
112             int r = get_next(root);
113             ans+=min(l, r);
114         }
115         printf("%d\n", ans);
116     }
117
118     return 0;
119 }

转载于:https://www.cnblogs.com/Penn000/p/5766702.html

HNOI2002(伸展树)相关推荐

  1. 伸展树(Splay tree)图解与实现

    伸展树(Splay tree)图解与实现 伸展树(Splay tree)图解与实现_小张的专栏-CSDN博客_splay树 Splay树详解 Splay树详解 - 秦淮岸灯火阑珊 - 博客园 平衡树 ...

  2. [Splay伸展树]splay树入门级教程

    首先声明,本教程的对象是完全没有接触过splay的OIer,大牛请右上角.. 首先引入一下splay的概念,他的中文名是伸展树,意思差不多就是可以随意翻转的二叉树 PS:百度百科中伸展树读作:BoGa ...

  3. AVL树、splay树(伸展树)和红黑树比较

    AVL树.splay树(伸展树)和红黑树比较 一.AVL树: 优点:查找.插入和删除,最坏复杂度均为O(logN).实现操作简单 如过是随机插入或者删除,其理论上可以得到O(logN)的复杂度,但是实 ...

  4. 【bzoj1251】序列终结者(伸展树)

    [bzoj1251]序列终结者(伸展树) Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我 ...

  5. HYSBZ 1503 郁闷的出纳员 伸展树

    题目链接: https://vjudge.net/problem/26193/origin 题目描述: 中文题面....... 解题思路: 伸展树, 需要伸展树的模板, 突然发现自己昨天看到的模板不是 ...

  6. 伸展树算法c语言,数据结构伸展树介绍及C语言的实现方法

    概要 本章介绍伸展树.它和"二叉查找树"和"AVL树"一样,都是特殊的二叉树.在了解了"二叉查找树"和"AVL树"之后, ...

  7. PHP算法 《树形结构》 之 伸展树(1) - 基本概念

    伸展树的介绍 1.出处:http://dongxicheng.org/structure/splay-tree/ A. 概述 二叉查找树(Binary Search Tree,也叫二叉排序树,即Bin ...

  8. [置顶] hdu 1890 伸展树区间翻转

    题意: 给你n个数,每次先输出第i大的数的位置(如果有多个,选下标小的那个),然后每次将第i个位置到第i大的数所在位置之间的数进行翻转. 思路:输入的数组可能有多个相同的值,我们可以进行两次排序把数组 ...

  9. 伸展树(Splay tree)浅谈

    树看的越来越多,越来越神奇. 看伸展树这种神级数据结构之前,建议大家首先彻底明白二叉搜索树,这是万树的基础. 然后可以去看下treap,最好再去看下红黑树.如果有线段树的基础那更好了,我们会发现线段树 ...

  10. 数据结构与算法专题——第十题 输入法跳不过的坎-伸展树

    我们知道AVL树为了保持严格的平衡,所以在数据插入上会呈现过多的旋转,影响了插入和删除的性能,此时AVL的一个变种伸展树(Splay)就应运而生了,我们知道万事万物都遵循一个"八二原则&qu ...

最新文章

  1. 黑色星期五阿里云向海淘输出双11技术
  2. 人脸识别有哪些利与弊
  3. [分享]学历与学习力
  4. C语言之从内存角度理解不同类型的变量
  5. ScrollView中嵌入Listview,当item高度不一样的时候,item展示不全问题
  6. JavaFX常用汇总
  7. LeetCode 475. 供暖器(双指针二分查找)
  8. 手机端使用ghelper_Anki手机端使用指南(一)
  9. LeetCode 141. Linked List Cycle (链表循环)
  10. 【Mac】Mac下SSH免密登录localhost
  11. html浮动跟随鼠标,jQuery 图片跟随鼠标浮动
  12. vbs 一些学习资料
  13. 腾讯宣布捐赠1亿元驰援河南;苹果回应iPhone 安全隐患;贝索斯完成10分钟太空之旅|极客头条...
  14. Java之戳中痛点 - (5)switch语句break不能忘以及default不同位置的用法
  15. HashMap与LinkedHashMap的结构对比
  16. LINUX虚拟机与WINDOWS主机,直接复制交换文件会有问题
  17. mysql mssql 性能对比_详解mysql分区实验测试--非分区表与分区表的性能对比
  18. SPC统计及控制图系列标准
  19. IDEA相对路径没有效果的问题
  20. 3D游戏建模学习路线

热门文章

  1. 10倍提升应用性能的10个建议 (理论篇)
  2. maven下载jar包慢及其他
  3. ASP.NET中?和??的用法
  4. proto3与proto2的区别
  5. 25. Consider support for a non-throwing swap
  6. struts2之数据处理的三种方式
  7. mysql 前10条 平均数_mysql – 每组最新N条记录的平均值
  8. 你真的把数据库事务搞懂了吗,有图有真相,图文并茂!
  9. 解决mysql不是内部或外部命令 菜鸟教程
  10. python与pycharm的作用_JSON 在pycharm 与python 三者有什么关系?JSON有什么作用?