Есть 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]
Мобильная версия