邻值查找set

# 题意
给定一个长度为 n 的序列 A,A 中的数各不相同。对于 A 中的每一个数 Ai,求:
min1≤j<i | Ai − Aj |
以及令上式取到最小值的 j(记为 Pi)。若最小值点不唯一,则选择使 Aj 较小的那个。

# 题解
用set因为set内部是平衡二叉树,每次插入都保持有序,
因为首先保证差的绝对值最小然后取位于前面的,所以先算后面的,
再判断如果值相同或更小更新为前面的

 1 #include <bits/stdc++.h>
 2 #define pii pair<int,int>
 3 #define fi first
 4 #define se second
 5 using namespace std;
 6 set<pii>s;
 7 int main(){
 8    int n,a;
 9    cin>>n>>a;
10    s.insert({a,1});
11    for(int i=2;i<=n;i++){
12       int x;
13       cin>>x;
14       s.insert( { x , i } );
15       auto it = s.find({x, i});
16       pii ans;
17       ans.fi=INT_MAX;//当只有一个元素时用于判断
18       auto it_=it;
19       if(++it_ != s.end())//set的end不指向任何一个元素,是个标志,如果当前是end证明x没有后继
20          ans = {it_->fi - x,it_->se};
21       if(it -- != s.begin() && ans.fi >= x - it->fi)//当前不是开头证明前面有比他小的
22          ans = { x - it->fi,it->se};
23       cout<<ans.fi<<' '<<ans.se<<endl;
24    }
25 }

猜你喜欢

转载自www.cnblogs.com/hhyx/p/12446206.html