Решите CSES Mountain Change эффективно [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Решите CSES Mountain Change эффективно [закрыто]

Сообщение Anonymous »

Это проблема горного хребта CSES: https://cses.fi/problemset/task/3314/

Есть n горы подряд, каждая с определенной высотой. Вы начинаете свой глиневый маршрут с горы. Вы можете скользить с горы a на гору n : количество гор.

Следующая строка имеет n integers h 1 , h 2 , ..., h : высоты горов. /> Указанные ограничения -

1 ≤ n ≤ 2*10 5

1 ≤ h ≤ 10 9 ≤ 10 9 . Модифицированный Dijkstra. Я храню максимальное количество гор, которые вы можете добраться на концом маршрута в горе I в DP . Я использую приоритетную_КОВУ, чтобы сначала пройти горы с более длинными маршрутами. Чтобы обработать гору u из очереди, я пытаюсь улучшить ответ на всех близлежащих горах слева и вправо, пока она не попадет в гору, а не короче, чем u. Когда самый длинный путь к соседней горе становится больше, я добавляю его в очередь. другие. < /p>

Код: Выделить всё

#include 
#include 
#include 
int main() {
using namespace std;
int n;
cin >> n;
vector heights(n);
for (int i = 0; i < n; i++) {
int height;
cin >> height;
heights[i] = height;
}
priority_queue
> q;
vector dp(n);
for (int i = 0; i < n; i++) {
dp[i] = 1;
q.push(make_pair(dp[i], i));
}
int mx = 0;
while (!q.empty()) {
auto u = q.top();
q.pop();
mx = max(mx, dp[u.second]);
if (u.first < dp[u.second]) {
continue;
}
for (int i = u.second + 1; i < n; i++) {
if (heights[i] >= heights[u.second]) {
break;
}
if (dp[u.second] + 1 > dp[i]) {
dp[i] = dp[u.second] + 1;
q.push(make_pair(dp[i], i));
}
}
for (int i = u.second - 1; i >= 0; i--) {
if (heights[i] >= heights[u.second]) {
break;
}
if (dp[u.second] + 1 > dp[i]) {
dp[i] = dp[u.second] + 1;
q.push(make_pair(dp[i], i));
}
}
}
cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79751600/solve-cses-mountain-range-efficiently[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»