# 题意
给定一个长度为 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 }