fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <utility>
  4. #include <algorithm>
  5. #include <cmath>
  6.  
  7. using namespace std;
  8.  
  9. int main() {
  10. ios_base::sync_with_stdio(0);
  11. cin.tie(0);
  12.  
  13. int m, n;
  14. cin >> m >> n;
  15.  
  16. // Đọc dãy A và B
  17. vector<pair<long long, int>> a(m), b(n);
  18.  
  19. for (int i = 0; i < m; i++) {
  20. cin >> a[i].first;
  21. a[i].second = i + 1; // Lưu chỉ số ban đầu
  22. }
  23.  
  24. for (int i = 0; i < n; i++) {
  25. cin >> b[i].first;
  26. b[i].second = i + 1; // Lưu chỉ số ban đầu
  27. }
  28.  
  29. // Sắp xếp cả hai dãy
  30. sort(a.begin(), a.end());
  31. sort(b.begin(), b.end());
  32.  
  33. long long min_absolute_sum = (long long)1e18; // Giá trị nhỏ nhất
  34. int pos_a = -1, pos_b = -1; // Lưu chỉ số kết quả
  35.  
  36. // Tìm cặp tối ưu
  37. for (int i = 0; i < m; ++i) {
  38. long long target = -a[i].first; // Tìm giá trị gần 0 nhất
  39. int pos = lower_bound(b.begin(), b.end(), make_pair(target, 0)) - b.begin();
  40. int prev_pos = pos - 1;
  41.  
  42. // Kiểm tra phần tử tại `pos`
  43. if (pos < n) {
  44. long long cur_sum = abs(a[i].first + b[pos].first);
  45. if (cur_sum < min_absolute_sum) {
  46. min_absolute_sum = cur_sum;
  47. pos_a = a[i].second;
  48. pos_b = b[pos].second;
  49. }
  50. }
  51.  
  52. // Kiểm tra phần tử trước `pos`
  53. if (prev_pos >= 0) {
  54. long long cur_sum = abs(a[i].first + b[prev_pos].first);
  55. if (cur_sum < min_absolute_sum) {
  56. min_absolute_sum = cur_sum;
  57. pos_a = a[i].second;
  58. pos_b = b[prev_pos].second;
  59. }
  60. }
  61. }
  62.  
  63. // In kết quả
  64. cout << pos_a << " " << pos_b << endl;
  65.  
  66. return 0;
  67. }
Success #stdin #stdout 0.01s 5292KB
stdin
4 5 
1 8 2 9 
-5 -6 3 -7 -4

stdout
2 4