luogu2234 [HNOI2002]营业额统计

treap水过

#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int n, uu, rot, cnt, sum=0, ans1, ans2;
const int oo=2147483647;
struct Treap{
	int val[35005], hav[35005], l[35005], r[35005], rnd[35005];
	void lRotate(int &k){
		int t=r[k]; r[k] = l[t]; l[t] = k; k = t;
	}
	void rRotate(int &k){
		int t=l[k]; l[k] = r[t]; r[t] = k; k = t;
	}
	void insert(int &k, int x){
		if(!k){
			k = ++cnt;
			val[k] = x; rnd[k] = rand();
			return ;
		}
		if(val[k]<x){
			insert(r[k], x);
			if(rnd[r[k]]<rnd[k])	lRotate(k);
		}
		else{
			insert(l[k], x);
			if(rnd[l[k]]<rnd[k])	rRotate(k);
		}
	}
	void queryPre(int k, int x){
		if(!k)	return ;
		if(val[k]<=x)	ans1 = val[k], queryPre(r[k], x);
		else	queryPre(l[k], x);
	}
	void queryNxt(int k, int x){
		if(!k)	return ;
		if(val[k]>=x)	ans2 = val[k], queryNxt(l[k], x);
		else	queryNxt(r[k], x);
	}
}treap;
int main(){
	cin>>n;
	for(int i=1; i<=n; i++){
		ans1 = -oo; ans2 = oo;
		scanf("%d", &uu);
		treap.queryPre(rot, uu);
		treap.queryNxt(rot, uu);
		if(i==1)	sum += uu;
		else if(ans1!=-oo && ans2!=oo)	sum += min(uu-ans1, ans2-uu);
		else if(ans1!=-oo)	sum += uu - ans1;
		else	sum += ans2 - uu;
		treap.insert(rot, uu);
	}
	cout<<sum<<endl;
	return 0;
}
posted @ 2018-01-29 15:04  poorpool  阅读(137)  评论(0)    收藏  举报