HNOI2002 营业额统计 splay

解题思路:找边上最近的值。

解题思路:splay

解题代码:

  1 // File Name: poj3468.sz.cpp
  2 // Author: darkdream
  3 // Created Time: 2014年11月07日 星期五 08时45分48秒
  4 #include<limits.h>
  5 #include<vector>
  6 #include<list>
  7 #include<map>
  8 #include<set>
  9 #include<deque>
 10 #include<stack>
 11 #include<bitset>
 12 #include<algorithm>
 13 #include<functional>
 14 #include<numeric>
 15 #include<utility>
 16 #include<sstream>
 17 #include<iostream>
 18 #include<iomanip>
 19 #include<cstdio>
 20 #include<cmath>
 21 #include<cstdlib>
 22 #include<cstring>
 23 #include<ctime>
 24 #define LL long long
 25 #define maxn 1000010
 26 using namespace std;
 27 #define valtree ch[ch[root][1]][0]
 28 struct SplayTree{
 29      int ch[maxn][2];
 30      int pre[maxn];
 31      int root ;
 32      int top1;
 33     inline void Rotate(int x ,int f){
 34        int y = pre[x];
 35        ch[y][!f] = ch[x][f];
 36        pre[ch[x][f]] = y ;
 37        pre[x] = pre[y];
 38        if(pre[x])
 39            ch[pre[y]][ch[pre[y]][1] == y] = x;
 40        ch[x][f] = y ;
 41        pre[y] = x;
 42    }
 43    void Splay(int x, int goal){
 44       while(pre[x] != goal){
 45          if(pre[pre[x]] == goal){
 46             Rotate(x,ch[pre[x]][0] == x);
 47          }else{
 48             int y = pre[x],z = pre[y];
 49             int f = (ch[z][0] == y);
 50             if(ch[y][f] == x)
 51             {
 52                 Rotate(x,!f),Rotate(x,f);
 53             }else{
 54                 Rotate(y,f),Rotate(x,f);
 55             }
 56          }
 57       }
 58       if(goal == 0 ) root = x;
 59    }
 60    int ABS(int x)
 61    {
 62       if(x < 0)
 63           return -x;
 64       return x ;
 65    }
 66    int  Rotateto(int k ,int goal)
 67    {
 68        int r = root ;
 69        int mi = INT_MAX;
 70        while(1)
 71        {
 72          mi = min(mi,ABS(val[r]-k));
 73          if(!ch[r][val[r] < k])
 74              break;
 75          r = ch[r][val[r] < k ];
 76        }
 77        int &tt = ch[r][val[r] < k];
 78        newnode(tt,k);
 79        pre[tt] = r;
 80        Splay(tt,0);
 81        return mi;
 82    }
 83    /*void erase(int x ){
 84        int father = pre[x];
 85        int head = 0 , tail = 0 ;
 86        for()
 87        }*/
 88    /*void debug(){printf("%d\n",root);Treaval(root);}
 89    void Treaval(int x) {
 90        if(x) {
 91            Treaval(ch[x][0]);
 92            printf("结点%2d:左儿子 %2d 右儿子 %2d 父结点 %2d size = %2d ,val = %2d sum = %3lld\n",x,ch[x][0],ch[x][1],pre[x],sz[x],val[x],sum[x]);
 93            Treaval(ch[x][1]);
 94        }
 95    }*/
 96    void newnode(int &x,int c)
 97    {
 98       x = ++ top1;
 99       ch[x][0] = ch[x][1] = pre[x] = 0 ;
100       val[x] = c;
101    }
102    void init(int v)
103    {
104        ch[0][0] = ch[0][1] = pre[0] =0 ;
105        root = top1 = 0 ;
106        newnode(root,v); //这里注意 root 是从1 开始的
107    }
108    int val[maxn];
109 }sp;
110 int main(){
111    int n ;
112    scanf("%d",&n);
113    if(n == 0 )
114    {
115      printf("%d\n",0);
116      return 0;
117    }
118    int v;
119    scanf("%d",&v);
120    sp.init(v);
121    int ans = v;
122    for(int i = 1;i < n;i ++)
123    {
124      if(scanf("%d",&v) == EOF)
125          v = 0 ;
126      ans += sp.Rotateto(v,0);
127    }
128    printf("%d\n",ans);
129 return 0;
130 }

时间: 2024-10-18 16:46:04

HNOI2002 营业额统计 splay的相关文章

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

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

BZOJ1588 [HNOI2002]营业额统计 splay模板

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

HNOI2002]营业额统计 Splay tree

保存模板: 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<string> 6 #include<string.h> 7 8 typedef long long ll; 9 using namespace std; 10 #define N 100005 11 #define inf 1<<

bzoj1588: [HNOI2002]营业额统计 splay瞎写

最近各种瞎写数论题,感觉需要回顾一下数据结构 写一发splay冷静一下(手速过慢,以后要多练练) 用splay是最直接的方法,但我感觉离散一波应该可以做出来(没仔细想过) 现在没有很追求代码优美,感觉得先打的对打的快O(∩_∩)O 1 #include <bits/stdc++.h> 2 #define INF 1000000000 3 using namespace std; 4 int root,N,n,x; 5 int fa[100005],c[100005][2],a[100005];

1588: [HNOI2002]营业额统计 splay tree

//http://www.lydsy.com/JudgeOnline/problem.php?id=1588 //题意:每读入一个数,在前面输入的数中找到一个与该数相差最小的一个,把所有的差值绝对值加起来并输出 1 #include "bits/stdc++.h" 2 using namespace std; 3 const int maxn = 100010; 4 const int INF = 0x3f3f3f3f; 5 struct SplayTreeNode 6 { 7 int

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)

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拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者

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

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

BZOJ 1588: [HNOI2002]营业额统计

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