BZOJ1588 [HNOI2002] 营业额统计

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588

又是一道Treap模版题……总做模版题不好……

另外牢记:BZOJ上用srand(time(0))会RE!

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <ctime>
 6 #define rep(i,l,r) for(int i=l; i<=r; i++)
 7 #define clr(x,y) memset(x,y,sizeof(x))
 8 typedef long long ll;
 9 typedef unsigned long long ull;
10 using namespace std;
11 const int INF = 0x3f3f3f3f;
12 const int maxn = 50010;
13 struct node{
14     int v,w,l,r,rnd,size;
15 }t[maxn];
16 int n,x,t1,t2,tot=0,root=0,ans=0;
17 inline int read(){
18     int ans = 0, f = 1;
19     char c = getchar();
20     while (!isdigit(c)){
21         if (c == ‘-‘) f = -1;
22         c = getchar();
23     }
24     while (isdigit(c)){
25         ans = ans * 10 + c - ‘0‘;
26         c = getchar();
27     }
28     return ans * f;
29 }
30 inline void update(int w){
31     t[w].size = t[t[w].l].size + t[t[w].r].size + t[w].w;
32 }
33 void rotl(int &w){
34     int k = t[w].r; t[w].r = t[k].l; t[k].l = w;
35     update(w); update(k); w = k;
36 }
37 void rotr(int &w){
38     int k = t[w].l; t[w].l = t[k].r; t[k].r = w;
39     update(w); update(k); w = k;
40 }
41 void insert(int x,int &w){
42     if (!w){
43         w = ++tot; t[w].v = x; t[w].size = t[w].w = 1;
44         t[w].rnd = rand(); t[w].l = t[w].r = 0; return;
45     }
46     t[w].size++; if (t[w].v == x) t[w].w++;
47     else if (x < t[w].v){
48         insert(x,t[w].l);
49         if (t[t[w].l].rnd < t[w].rnd) rotr(w);
50     }
51     else{
52         insert(x,t[w].r);
53         if (t[t[w].r].rnd < t[w].rnd) rotl(w);
54     }
55 }
56 void bef(int x,int w){
57     if (!w) return;
58     if (t[w].v <= x){
59         t1 = t[w].v;
60         bef(x,t[w].r);
61     }
62     else bef(x,t[w].l);
63 }
64 void aft(int x,int w){
65     if (!w) return;
66     if (t[w].v >= x){
67         t2 = t[w].v;
68         aft(x,t[w].l);
69     }
70     else aft(x,t[w].r);
71 }
72 int main(){
73     n = read();
74     rep(i,1,n){
75         if (scanf("%d",&x) == EOF) x = 0;
76         t1 = -INF; t2 = INF;
77         bef(x,root); aft(x,root);
78         if (i == 1) ans += x;
79         else ans += min(x-t1,t2-x);
80         insert(x,root);
81     }
82     printf("%d\n",ans);
83     return 0;
84 }

时间: 2024-08-07 16:32:10

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

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

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

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

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

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

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

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

BZOJ1588: [HNOI2002]营业额统计(正解:平衡树,我的歪解:暴力)

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

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];

bzoj1588 [HNOI2002]营业额统计 (平衡树)

平衡树裸题 只需要求前驱后驱 treap写法 const mm=1<<30; maxnumber=500000; maxn=500000; var left,right,fix,key:array[0..maxn]of longint; t,n,ans,i,j,k,l,tot:longint; function min(x,y:longint):longint; begin if x<y then exit(x); exit(y); end; function max(x,y:longi

bzoj1588: [HNOI2002]营业额统计 treap

原来treap这么简单...比splay简单多了.... #include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizeof(a)) using namespace std; typedef long long ll; const int maxn=1000100; const int INF=1e9+10; int n,a; struct Node { Nod