码迷,mamicode.com
首页 > 其他好文 > 详细

Bzoj-营业额统计 Set||treap

时间:2017-09-23 20:15:33      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:lap   algo   黑科技   get   clu   clear   png   led   href   

    看题戳我技术分享

  (约)半年前看ZHQ(Brian551)写过,但是苦于没什么时间+treap不会+splay的succ什么的写的不大熟,也就丢预计刷题集里面了。今天按acc率排序之后又看见了他,也就挤出一点时间来写了qwq(其实是因为我把这道题忘了

  看到cxk(Bunnycxk)等大神的刷题量突飞猛进,感觉自己不努力就被甩飞啦,所以就努力了一小会,刚好用set写过一道也是求后继的题(戳我),为这道题提供了不错的黑科技

  题目大意:n天,每天一个营业额x,fi定义为第i天之前的某一天的营业额和当前x的最小差,求∑fi

  这道题n2的dp明显会超时吧,所以我写了nlogn

  借助了一下set.lower_bound,用于查询后继,但是还有一个前驱呢,怎么办捏,考虑到lower_bound(x)的定义,有序序列中第一个>=x的数,那么第一个<=x的数就是当前这个数的位置-1咯,那问题就能很好的解决了,没毛病

  Treap依旧不会写,以后补

  上一波set的代码:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<map>
#include<set>
#include<queue> 
#include<algorithm>
using namespace std;
#define INF 0x7FFFFFFF
#define ll long long
void read(int &x){
    x=0;int f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    x*=f;
}
set<int>tree;
int n,x,ans,add;
int main(){
	read(n);tree.clear();read(x);ans=x;tree.insert(x);
	for(int i=2;i<=n;i++){
		read(x);add=INF;
		set<int>::iterator a=--tree.lower_bound(x),b=tree.lower_bound(x);
		if(tree.count(*a)) add=min(add,abs(x-*a));
		if(tree.count(*b)) add=min(add,abs(x-*b));
		//printf("%d %d\n",*a,*b);
		ans+=add;
		tree.insert(x);
	}
	printf("%d\n",ans);
	return 0;
}

  

 

Bzoj-营业额统计 Set||treap

标签:lap   algo   黑科技   get   clu   clear   png   led   href   

原文地址:http://www.cnblogs.com/ZincSabian/p/7582038.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!