您的位置:首页 > 其它

BZOJ1588 [HNOI2002] 营业额统计

2015-11-26 21:31 337 查看
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588

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

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

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <ctime>
#define rep(i,l,r) for(int i=l; i<=r; i++)
#define clr(x,y) memset(x,y,sizeof(x))
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 50010;
struct node{
int v,w,l,r,rnd,size;
}t[maxn];
int n,x,t1,t2,tot=0,root=0,ans=0;
inline int read(){
int ans = 0, f = 1;
char c = getchar();
while (!isdigit(c)){
if (c == '-') f = -1;
c = getchar();
}
while (isdigit(c)){
ans = ans * 10 + c - '0';
c = getchar();
}
return ans * f;
}
inline void update(int w){
t[w].size = t[t[w].l].size + t[t[w].r].size + t[w].w;
}
void rotl(int &w){
int k = t[w].r; t[w].r = t[k].l; t[k].l = w;
update(w); update(k); w = k;
}
void rotr(int &w){
int k = t[w].l; t[w].l = t[k].r; t[k].r = w;
update(w); update(k); w = k;
}
void insert(int x,int &w){
if (!w){
w = ++tot; t[w].v = x; t[w].size = t[w].w = 1;
t[w].rnd = rand(); t[w].l = t[w].r = 0; return;
}
t[w].size++; if (t[w].v == x) t[w].w++;
else if (x < t[w].v){
insert(x,t[w].l);
if (t[t[w].l].rnd < t[w].rnd) rotr(w);
}
else{
insert(x,t[w].r);
if (t[t[w].r].rnd < t[w].rnd) rotl(w);
}
}
void bef(int x,int w){
if (!w) return;
if (t[w].v <= x){
t1 = t[w].v;
bef(x,t[w].r);
}
else bef(x,t[w].l);
}
void aft(int x,int w){
if (!w) return;
if (t[w].v >= x){
t2 = t[w].v;
aft(x,t[w].l);
}
else aft(x,t[w].r);
}
int main(){
n = read();
rep(i,1,n){
if (scanf("%d",&x) == EOF) x = 0;
t1 = -INF; t2 = INF;
bef(x,root); aft(x,root);
if (i == 1) ans += x;
else ans += min(x-t1,t2-x);
insert(x,root);
}
printf("%d\n",ans);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: