Проблема: Пара целых чисел (x,y) является идеальной, если выполняются оба следующих условия:

  1. мин(|х-у|,|х+у|)‹=мин(|х|,|у|)
  2. max(|x-y|,|x+y|)›=max(|x|,|y|)

Для заданного массива длины n найдите количество идеальных пар (arr[i], arr[j]), где 0‹=i‹j‹n

Здесь min(a,b) — минимальное значение a и b, max(a,b) — максимальное значение a и b, а |x| является абсолютным значением x.

Пример:
обр = [-9,6, -2,1] -> ответ = 2
обр = [2,5, -3] - > ответ = 2

Как решить это с временной сложностью меньше, чем O (n²)?

void callPerfectPairs(vector<int> v, int n) {
    //|y| <= 2 * |x| where x < y
    sort(v.begin(), v.end());
    
    //binary search for satisfying above condition
    //or two pointer approach
    
    int i, j;
    int res = 0;
    //condition valid x < y
    i = j = 0;
    while (i < n && j < n) {
        if (i == j) j++;
        else if (i < j && 2*i<j) i++;
        else if (i < j && 2*i >= j) {
            res+=(j-i);
            j++;
        }
        
        
    }
    cout <<res <<endl;
}

int main() {
    int n;
    cin>>n;
    vector<int> v;
    for (int i = 0; i < n; i++) {
        int j;
        cin>>j;
        v.push_back(j);
    }
    
    callPerfectPairs(v, n);
}
/**
min(|x-y|,|x+y|)<=min(|x|,|y|)
max(|x-y|,|x+y|)>=max(|x|,|y|)

0<=i<j<n for (arr[i], arr[j])
The condition is matters only when we talk about indexes in the result

min(|x-y|, |x+y|) > 0 (Always) ... |x-y| > 0 and |x+y| > 0 ...
                  min
x < 0, y > 0 ... |x+y| ... ||x|-|y||
x > 0, y < 0 ... |x+y| ... ||x|-|y||
x > 0, y > 0 ... |x-y| ... ||x|-|y||
x < 0, y < 0 ... |x-y| ... ||x|-|y|| 
--- ||x|-|y||

max(|x-y|, |x+y|) > 0 (Always) ... ||x|+|y|| > |x| || |y| (always)

min(|x-y|, |x+y|) = ||x|-|y|| < min(|x|, |y|)
||x|-|y|| <= |y| when x > y as always min considered
or |y| - |x| <= |x| 
|y|-|x| <= |x|
|y| <= 2 * |x| when y > x

-9 6 -2 1
1,2 1,6 1,9 2,6 2,9 6,9 - check possible
1,2 1,3
1,6 5,7


1 2 6 9 10 12 14
2 4 12 18 
logic 12 >= 9 --- 6,9 valid pair j,i --- j-i
logic 2 >= 2 --- 1,2 valid pair j,i --- j-i

Final 
1. sort and positive
|y| < 2|x| where |x|>|y|
window logic
i = j then j++ as i != j
i < j if 2 * i < j < j+1 < j+2  
if 2 * i >= j  then res += j-i and j++;

*/