Помогите решить задачу. Нужно определить группы подобия треугольников быстрее O(n^2). Условие на фото

#include <iostream>
#include <vector>
#include <algorithm>

struct Triangle {
    int var_a, var_b, var_c;    
    Triangle(){};
    Triangle(int var_a, int var_b, int var_c):var_a(var_a), var_b(var_b), var_c(var_c){};
    
    bool operator<(const Triangle &other) {
        return var_a < other.var_a || var_b < other.var_b || var_c < other.var_c;
    }
    
    bool operator>(const Triangle &other) {
        return var_a > other.var_a || var_b > other.var_b || var_c > other.var_c;
    }
    
    bool operator==(const Triangle &other) {
        return var_a == other.var_a && var_b == other.var_b && var_c == other.var_c;
    }
};

int gcd(int var_a, int var_b);

void search_big(int &var_a, int &var_b);

Triangle ascending_tr(int var_a, int var_b, int var_c);

void ascending(std::vector<Triangle> &arr, int left, int right);

int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    
    int len;
    std::cin >> len;
    std::vector<Triangle> arr;
    while (len--) {
        int var_a, var_b, var_c;
        std::cin >> var_a >> var_b >> var_c;
        int var_g = gcd(var_a, gcd(var_b, var_c));
        arr.emplace_back(ascending_tr(var_a / var_g, var_b / var_g, var_c / var_g));
    }
    
    len = arr.size();
    
    ascending(arr, 0, len - 1);
    
    int ans = 1;
    
    for (int i = 1; i < len; ++i) {
        if (!(arr[i] == arr[i - 1])) {
            ++ans;
        }
    }
    
    std::cout << ans;
    
    return 0;
}

int gcd(int var_a, int var_b) {
    return var_b ? gcd(var_b, var_a % var_b) : var_a;
}

void search_big(int &var_a, int &var_b) {
    if (var_a > var_b) {
        std::swap(var_a, var_b);
    }
}

Triangle ascending_tr(int var_a, int var_b, int var_c) {
    search_big(var_a, var_b);
    search_big(var_a, var_c);
    search_big(var_b, var_c);
    
    return { var_a, var_b, var_c };
}

void ascending(std::vector<Triangle> &arr, int left, int right) {
    if (left >= right) {
        return;
    }
    
    Triangle pivot = arr[(left + right) >> 1];
    int var_i = left, var_j = right;
    while (var_i <= var_j) {
        while (arr[var_i] < pivot) {
            ++var_i;
        }
        
        while (arr[var_j] > pivot) {
            --var_j;
        }
        
        if (var_i <= var_j) {
            std::swap(arr[var_i], arr[var_j]);
            ++var_i, --var_j;
        }
    }
    
    ascending(arr, left, var_j);
    ascending(arr, var_i, right);
}

/*

3
6 6 10
15 25 15
35 21 21

4
3 4 5
10 11 12
6 7 8 
6 8 10

*/

Задача упала на тесте, никак не могу придумать подходящего решения удовлетворяющего ограничениям.


Ответы (0 шт):