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 }
View Code

posted on 2015-11-26 21:31  ACMICPC  阅读(205)  评论(0编辑  收藏  举报

导航