Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2019, 00:15   #1
cppc
Новичок
Джуниор
 
Регистрация: 08.03.2019
Сообщений: 2
По умолчанию Прыжки по зданиям (C++)

В городе есть n зданий с высотами h1; h2; ...; hn. Мальчик любит прыгать по зданиям и может прыгнуть из одного здания на другое только тогда, когда их высоты одинаковы и высоты всех зданий между ними не превышает высоты текущего здания.
Вам нужно посчитать количество таких пар зданий, которые мальчик может перепрыгнуть с одного дома на другой.

Входные данные:
В первой строке записано целое число n (n ≤ 3 * 10^5). Во второй строке записаны n целых чисел h1; h2 ...; hn (1 ≤ hi ≤ 10^6).

Входные данные:
Выведите единственное целое число - ответ на задачу.

Пример 1:
Ввод
6
3 2 1 2 3 3
Вывод
8

Пример 2:
Ввод
3
1 1000 1
Вывод
0

В примере 1 каждая из следующих пар считается в ответе два раза (в прямом и перевернутом порядке): (1, 5); (1, 6); (5, 6); (2, 4).

Задание нужно решить с использованием дерева отрезков, иначе не пройдет по времени.

Начал чтото делать:

Код:
//Задание на дерево отрезков
#include <iostream>
#include <cstring>
#define N 300003
using namespace std;
long long a[N], t[4 * N];
 
//Построение дерева отрезков
void build (long long a[], int v, int tl, int tr) {
    if (tl == tr) t[v] = a[tl];
    else
    {
        int tm = (tl + tr) / 2;
        build (a, v*2, tl, tm);
        build (a, v*2+1, tm+1, tr);
    }
}
 
int number_of_pairs (int v, int tl, int tr)
{
    //TODO
}
 
long long n, l, r, i, j, x;
int main ()
{
    memset(t,0,sizeof(t));
    cin >> n;
    for(j = 1; j <= n; j++) {cin >> x; a[j]=x;}
    build(a, 1, 1, n);
    cout << number_of_pairs(1,1,n) << endl;
    return 0;
}
Подскажите части псевдокодов дерева отрезков, которые нужно использовать при решени задания?

Вот мой вариант решения перебором:
Код:
#include <iostream>
#include <vector>
//#define MAXN 1000001
//#define MAXX 1000001
#define _ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
using namespace std;
vector<int> v;
int func(vector <int> V)
{
    int q = 0;
    for (int i1 = 0; i1<V.size()-1; i1++)
    {
        for (int i2 = i1+1; i2<V.size(); i2++)
        {
            if (V[i1] == V[i2])
            {
                for (int i3 = 0; i3<V.size()-1; i3++)
                {
                    if (V[i1]>V[i3]) {q+=2; break;}
                }
            }
        }
    }
return q;
}
int main ()
{_
    int n, i, x;
    cin >> n;
    //v.resize(n);
    for (i = 0; i < n; i++)
    {
        cin >> x;
        v.push_back(x);
    }
    cout<<func(v)<<endl;
    return 0;
}
По моему, вариант перебором, не учитывает ситуацию, когда два здания одинаковой высоты находятся рядом и между ними нету других зданий.
Можете подправить код?

Проверте следующие тесты:

Тест #1.
2
6 6
Можно перепрыгнуть: (1, 2); Ответ 2. (Но выводится 0).

Тест #2.
6
5 4 3 3 4 5
Можно перепрыгнуть: (1, 6); (2, 5); (3, 4). Ответ 6. (Но выводится 4).

Тест #3.
6
3 4 5 5 4 3
Можно перепрыгнуть: (3, 4); Ответ 2. (Но выводится 4).

Гляньте пожалуйста.
cppc вне форума Ответить с цитированием
Старый 09.03.2019, 00:21   #2
cppc
Новичок
Джуниор
 
Регистрация: 08.03.2019
Сообщений: 2
По умолчанию

Думаю, для каждого здания деревом отрезков найти следующее по высоте справа. А потом посчитать сколько таких же зданий на этом отрезке. Но как это сделать програмно? Какие части псевдокодов дерева отрезков нужно использавать?
cppc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
когда написал код про прыжки,хочу открыть игру,но просто чёрный экран,а вот когда нажимаю на "Крестик" вижу этот квадратик который в игре на секунду,и всё SashaBiven Python 1 05.12.2018 08:30
Создание приложения (по карте города и некоторым зданиям в городе) Snow811 Помощь студентам 1 03.04.2014 10:28