形式化题意
给定一个长度为 n 的序列 A,A 中的数各不相同。
对于 A 中的每一个数 Ai,求:
min1≤j<i∣Ai−Aj∣
以及令上式取到最小值的 j(记为 Pi)。若最小值点不唯一,则选择使 j 较小的那个。
本来就很简洁了。
做法
给大家推荐一个好 STL:std::set
。
你只用理解成一个会自动给你排序,并且向前后移动指针都是 Θ(log(n)) 的容器就行了。
使用 s.find(a)
就是在 s
这个 set
里找到 a
这个元素,并返回它的指针(时间复杂度 Θ(log(n)))。
然后我们再比较它与前后的差异就可以了。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #include<bits/stdc++.h> #define pii pair<int,int> using namespace std; set<pii> s; int n, a; int main() { ios_base::sync_with_stdio(false); cin >> n >> a; s.insert(make_pair(a, 1)); for (int i = 2; i <= n; ++i) { cin >> a; s.insert(make_pair(a, i)); set<pii>::iterator t = s.find(make_pair(a, i)); pii ans; ans.first = 1e9; if (++t != s.end()) { ans = make_pair(t->first - a, t->second); } --t; if (t-- != s.begin() && ans.first >= a - t->first) { ans = make_pair(a - t->first, t->second); } cout << ans.first << ' ' << ans.second << endl; } return 0; }
|