营业额统计
题目链接: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;
}