• 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;
    }
    

      

    加油啦!加油鸭,冲鸭!!!
  • 相关阅读:
    Java 在方法和作用域内的内部类
    java 内部类和向上转型
    java 内部类使用 .this 和 .new
    java innerclasses(内部类)
    Java过滤器与SpringMVC拦截器之间的关系与区别
    Maven异常:Could not find artifact
    soapUI测试webservice(参数为xml格式的处理方式)
    maven仓库加载本地包依赖
    spring data jpa的学习总结
    Java 中常用缓存Cache机制的实现
  • 原文地址:https://www.cnblogs.com/clarencezzh/p/10668376.html
Copyright © 2020-2023  润新知