CH 1301 鄰值查詢 set
阿新 • • 發佈:2018-12-14
問題 H: 鄰值查詢
時間限制: 1 Sec 記憶體限制: 128 MB
提交: 23 解決: 11
[提交] [狀態] [討論版] [命題人:admin]
題目描述
給定一個長度為 n 的序列 A,A 中的數各不相同。對於 A 中的每一個數 Ai,求:
min(1≤j<i) |Ai-Aj|
以及令上式取到最小值的 j(記為 Pi)。若最小值點不唯一,則選擇使 Aj 較小的那個。
輸入
第一行一個整數n,第二行n個數A_1~A_n。
輸出
n-1行,每行2個用空格隔開的整數。分別表示當i取2~n時,對應的 min(1≤j<i) |A_i-A_j| 和 P_i 的值。
樣例輸入
3 1 5 3
樣例輸出
4 1 2 1
提示
對於30%的資料: n<=100
對於70%的資料: n<=10^4
對於100%的資料: n<=10^5, |A_i|<=10^9
題意:求出每個數a之前的與a的差的絕對值最小的那個數,若差的絕對值相同,則輸出數最小的那個
思路:STL裡的set可以將輸入的序列自動排序,那麼就該數之前與之後的數字就是與該數差最小的數,比較之後輸出即可
if else裡面的條件改變了迭代器的位置,一直沒發現,窒息
自認為寫的挺麻煩,不過應該很好懂。。
程式碼:
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 10; const int inf = 0x3f3f3f3f; struct node { int val, pos; bool operator<(const node &rhs) const { return val < rhs.val; } }; set<node> p; int main() { int n, a, b; scanf("%d", &n); scanf("%d", &a); p.insert({a, 1}); set<node>::iterator q, t; for (int i = 2; i <= n; i++) { scanf("%d", &b); p.insert({b, i}); if (p.size() == 2) { printf("%d 1\n", abs(a - b)); continue; } q = p.find({b, i}); if ((++q) == p.end()) { q--; node x = (*(--q)); x.val = abs(b - x.val); printf("%d %d\n", x.val, x.pos); continue; } else if ((--q) == p.begin()) { node x; x.val = abs(b - (*(++q)).val); x.pos = (*(q)).pos; printf("%d %d\n", x.val, x.pos); continue; } node x, y; q--; x.val = (*(q)).val; x.pos = (*q).pos; q++; y.val = (*(++q)).val; y.pos = (*(q)).pos; if (abs(b - x.val) < abs(b - y.val)) printf("%d %d\n", abs(b - x.val), x.pos); else if (abs(b - x.val) > abs(b - y.val)) printf("%d %d\n", abs(b - y.val), y.pos); else { printf("%d %d\n", abs(b - y.val), x.pos); } } return 0; }