Помогите ускорить код c++!
Помогите пожалуйста ускорить код, для этой задачи:
Синхронизация (20 баллов)
Группа из n спутников расположена на координатной прямой в точках с координатами 1, 2, ... n. Каждый спутник характеризуется мощностью генерируемого им сигнала pi. Если спутник в точке xi имеет мощность сигнала pi, то все спутники, находящиеся на расстоянии не большем чем pi, могут получить сигнал с этого спутника. Сам спутник свой сигнал не получает.
Для синхронизации работы, все спутники одновременно послали свои сигналы всем остальным спутникам, до которых их сигнал доходит. Требуется для каждого спутника определить от скольки других спутников он получил сигнал.
Input format
В первой строке находится число n -- количество спутников, 2 ≤ n ≤ 105. Во второй строке через пробел перечислены n целых чисел -- мощности соответствующих спутников. В i-ой позиции второй строки содержится мощность спутника, находящегося в точке i на координатной прямой. Все мощности -- целые числа в пределах от 1 до 109.
Output format
Вывести n чисел через пробел, характеризующие количество сигналов, полученных спутниками в процессе синхронизации. В i-ой позиции должно быть указано количество сигналов, полученных спутником, находящимся в точке i на координатной прямой.
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n;
cin >> n;
vector <int> a(n, -1);
for (int i = 0; i < n; i++){
int p;
cin >> p;
for (int j = max(0, i - p); j < min(n, i + p + 1); j++){
a[j] += 1;
}
}
for (int i = 0; i < n; i++){
cout << a[i] << " ";
}
}
Ответы (1 шт):
Для каждого спутника создайте три структуры, содержащие:
{левая граница = pos[i] - power[i]; +1}
{pos[i]; 0}
{правая граница = pos[i] + power[i]; -1}
и объедините всё в один вектор или массив
Отсортируйте вектор по первому полю. При равенстве первого поля раньше идёт запись с +1.
Инициализируйте active_count = 0, пройдите по вектору.
Если второе поле ненулевое, добавляйте его к active_count
Если нулевое, то соответствующий спутник принимает данные с active_count - 1 других.
Сложность O(nlogn) обусловлена сортировкой, проход по списку линейный.