0x13链表与邻接表之邻值查找

题目链接:https://www.acwing.com/problem/content/138/

参考链接:https://blog.csdn.net/sdz20172133/article/details/80101838

能进行算术运算的迭代器只有随即访问迭代器,要求容器元素存储在连续内存空间里,vector,string,deque的迭代器是有加减法的,但是map,set,multimap,multiset的迭代器是没有加减法的,list也不可以 。但是这些stl容器可以进行++和--的操作。

stl都是左闭右开的,就是说begin()是容器里面的第一个位置,end()是最后一个元素位置加一。

对于low_bound()和upper_bound()来说,前提:一个非降序列!!!!!!

题解:(平衡树解法)

把A1,A2,......An依次插入一个集合,则插入Ai之前,集合中保存的就是满足1<=j<i的所有Aj,而且是有序的。当Ai插入时,可能插入当前set的第一个位置,最后一个位置,或者中间某一个位置。其实就是对插入排序的优化。所以要求得最小差值,只需要比较Ai的前驱和后续位置的值。

#include<iostream>
#include<queue>
#include<set>

using namespace std;
struct node{
    int num;
    int id;
    bool operator <(node a) const{
        return num<a.num;
    }
};
set<node> s;
int main(){
    int n;
    cin>>n;
    for (int i = 1; i <= n; ++i) {
        int tmp;
        cin>>tmp;
        if (i==1) {
            s.insert(node{tmp,i});
            continue;
        }
     set<node>::iterator right= s.lower_bound(node{tmp,i});
     set<node>::iterator left=right;
     left--;
     if (right==s.end()) {
         cout<<tmp-left->num<<" "<<left->id<<endl;
     }else if (right==s.begin()) {
         cout<<right->num-tmp<<" "<<right->id<<endl;
     }else if((tmp-left->num)<=(right->num-tmp)){
         cout<<tmp-left->num<<" "<<left->id<<endl;

     }else{
         cout<<right->num-tmp<<" "<<right->id<<endl;

     }
     s.insert(node{tmp,i});
    }
    return 0;
}

  

加油啦!加油鸭,冲鸭!!!
原文地址:https://www.cnblogs.com/clarencezzh/p/10668376.html