营业额统计

题目链接:https://www.luogu.com.cn/problem/P2234

题意:略

思路:

可以用set二分来做,在线插入元素,对set进行lower_bound查找插入的元素

如果没找到说明插入的元素比之前的都大,直接abs(x-big)

如果找到,要看看两侧的哪个差值与插入的元素小

第一个大于等于它的元素和恰好小于它的元素比较

实现方面需要使set的迭代器自减,因此需要插入一个特别小的哨兵元素,以免发生错误

时间复杂度O(nlogn)

感觉这才是这道题的正确时间复杂度,暴力哪能行

void solve(){
	int n;cin>>n;
	ll sum=0;
	set<int>st;
	st.insert(-1145141919810);
	int big=-inf;
	for(int i=1;i<=n;i++){
		int x;cin>>x;
		ll res;
		auto it=st.lower_bound(x);
		if(it==st.end()){
			res=x-big;
		}else{
			auto y=it;
			y--;
			res=min(*it-x,x-*y);
		}
		if(i==1)res=x;
		
		sum+=res;
		st.insert(x);
		big=max(x,big);
//		cout<<"res "<<res<<endl;
	}
	cout<<sum;
}
posted @ 2025-03-09 18:40  Marinaco  阅读(11)  评论(0)    收藏  举报
//雪花飘落效果