Исходя из такой реализации это может быть и два метода или два прохода, что не будет являться линейной сложностью.
int CountSegments(const vector<int> &x, const vector<int> &y) {
int counters[2][2] = {{0,0}, {0,0}};
for (size_t i = 0; i < x.size(); ++i) {
if (x[i] == 0 || y[i] == 0) continue;
size_t xs = x[i] > 0 ? 1 : 0;
size_t ys = y[i] > 0 ? 1 : 0;
++counters[xs][ys];
}
return coutners[0][0]*counters[1][1] + counters[0][1]*counters[1][0];
}
GetRoot(id) {
h = households.get(householdID)
if (h.root != id)
h = GetRoot(h.root);
h.root = h.id; // эвристика сжатия путей
return h
}
Generate(1,0, {0}).
Вызывает Generate (2, 2, 0, {})
Вызывает Generate(2, 3, 0, {})
Вызывает Generate(2, 3, 2, {2})
Вызывает Generate(2, 2, 1, {1})
Вызывает Generate(2, 3, 1, {1})
Вызывает Generate(2, 3, 3, {1,2})
По ссылке: