zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    区间DP——石子合并
    线性DP-最短编辑距离、编辑距离
    生成树协议
    交换机技术
    以太网原理
    接口知识点
    目前在中国有影响的几种现场总线比较
    委托
    C#有关继承知识点
    C#数组总结
  • 原文地址:https://www.cnblogs.com/poorpool/p/8377385.html
Copyright © 2011-2022 走看看