1、题目大意:一个简单的treap模板题(我才不告诉你题目少一句话呢,看discuss去

2、分析:treap模板题

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
struct Node{
    Node *ch[2];
    int v, r, num, s;
    bool operator < (const Node& rhs) const{
        return r < rhs.r;
    }
    int cmp(int x){
        if(x == v) return -1;
        if(x < v) return 0;
        return 1;
    }
    void maintain(){
        s = num;
        if(ch[0]) s += ch[0] -> s;
        if(ch[1]) s += ch[1] -> s;
    }
};
struct treap{
    Node ft[1000000], *root;
    int cnt;
    void rotate(Node* &o, int d){
        Node *k = o -> ch[d ^ 1];
        o -> ch[d ^ 1] = k -> ch[d];
        k -> ch[d] = o;
        o -> maintain();
        k -> maintain();
        o = k;
    }
    void insert(Node* &o, int x){
        if(o == NULL){
            o = &ft[cnt ++];
            o -> r = rand();
            o -> num = o -> s = 1;
            o -> v = x;
            o -> ch[0] = o -> ch[1] = 0;
        }
        else {
            int d = o -> cmp(x);
            if(d == -1){
                o -> num ++;
            }
            else {
                insert(o -> ch[d], x);
                if(o -> ch[d] > o) rotate(o, d ^ 1);
            }
        }
        o -> maintain();
    }
    int kth(Node* &o, int k){
        int st = o -> num;
        if(o -> ch[0]) st += o -> ch[0] -> s;
        if(st - o -> num + 1 <= k && k <= st){
            return o -> v;
        }
        if(st - o -> num + 1 > k){
            return kth(o -> ch[0], k);
        }
        else{
            return kth(o -> ch[1], k - st);
        }
    }
    int less_k(Node* &o, int k){
        if(o == NULL) return 0;
        int d = o -> cmp(k);
        int st = o -> num;
        if(o -> ch[0]) st += o -> ch[0] -> s;
        if(d == -1) return st - o -> num;
        if(d == 0) return less_k(o -> ch[0], k);
        else return less_k(o -> ch[1], k) + st;
    }
} wt;
int a[1000000];
int main(){
    int n;
    scanf("%d", &n);
    int tt = 0;
    while(scanf("%d", &a[++ tt]) != EOF);
    int ans = 0;
    wt.insert(wt.root, a[1]);
    for(int i = 2; i <= n; i ++){
        int hh = wt.less_k(wt.root, a[i]);
        int oo = 2147483647;
        if(hh) oo = min(oo, abs(wt.kth(wt.root, hh) - a[i]));
        if(hh + 1 <= wt.root -> s) oo = min(oo, abs(wt.kth(wt.root, hh + 1) - a[i]));
        wt.insert(wt.root, a[i]);
        ans += oo;
    }
    printf("%d\n", ans + a[1]);
    return 0;
}

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

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

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

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

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

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

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

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

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

  5. [BZOJ1588][HNOI2002]营业额统计 无旋Treap

    [HNOI2002]营业额统计 时间限制: 5 Sec  内存限制: 162 MB 题目描述 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以 ...

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

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 16189  Solved: 6482 [Submit][S ...

  7. bzoj1588: [HNOI2002]营业额统计(权值线段树)

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

  8. bzoj1588: [HNOI2002]营业额统计(splay)

    1588: [HNOI2002]营业额统计 题目:传送门 题解: 复习splay所以来刷个水... 题目描述不是特别清楚:应该是找第i天以前一个最小的营业额和第i天做差的最小值作为第i天的最小波动值 ...

  9. [BZOJ1588] [HNOI2002] 营业额统计 (treap)

    Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额. ...

  10. BZOJ1588 [HNOI2002]营业额统计 set

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1588 题意概括 给出数列,求  ∑F[i],其中F[1] = a[1] , F[i] = min( ...

随机推荐

  1. HTML之表格制作

    如何制作一个表格? 如何制作一个表格呢?  观察如下代码: <!DOCTYPE html> <html lang="en"> <head> &l ...

  2. BZOJ4690: Never Wait for Weights

    裸带权并查集. #include<cstdio> #define N 100005 int m,i,j,s,t,u,d[N],p[N]; char k; int find(int i){ ...

  3. Python 抓取网页并提取信息(程序详解)

    最近因项目需要用到python处理网页,因此学习相关知识.下面程序使用python抓取网页并提取信息,具体内容如下: #---------------------------------------- ...

  4. wpf 前台获取资源文件路径问题

    1 <ImageBrush ImageSource="YT.CM.CommonUI;component/Resource/FloadwindowImage/middle.png&quo ...

  5. Opencv中将CvMat转为IplImage

    Opencv中将CvMat转为IplImage,并在内存获得起头指针,而不用cvSaveImage(),贴上代码 IplImage * imgg = NULL; imgg = cvCreateImag ...

  6. 如何修改Linux主机名

    Linux 下什么都比较麻烦,就连修改主机名也不例外.我们就下文说一下具体方法. Linux 安装好后,其默认的主机名是 localhost.修改 Linux 主机名需要3步. 使用 hostname ...

  7. HTML学习笔记——head、body及简单标签

    1> title标签.网站关键词.网站描述.实现百度网的跳转 2> 单标签.对标签.p标签 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...

  8. LaTex数学符号

    http://web.ift.uib.no/Teori/KURS/WRK/TeX/symALL.html

  9. SICP— 第一章 构造过程抽象

    SICP  Structure And Interpretation Of Computer Programs 中文第2版 分两部分  S 和 I 第一章 构造过程抽象 1,程序设计的基本元素 2,过 ...

  10. 界面调试工具reveal

    iOS界面调试工具 Reveal 转自 http://chuansong.me/n/1308113 原创2015-04-17 唐巧iOS开发 Reveal是一个iOS程序界面调试工具.使用Reveal ...