Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 14.06.2020
Сообщений: 7

Наибольшая возрастающая подпоследовательность за O(n*log(n) с восстановлением ответа

26.12.2020, 20:24. Показов 3334. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Все доброго времени суток. Есть задача:
Числовая последовательность задана рекуррентной формулой: ai+1=(k∗ai+b)mod m. Найдите её наибольшую возрастающую подпоследовательность.
Входные данные
Программа получает на вход пять целых чисел: длину последовательности n (1≤n≤10^5), начальный элемент последовательности a1, параметры k, b, m для вычисления последующих членов последовательности (1≤m≤10^4, 0≤k<m, 0≤b<m, 0≤a1<m).
Выходные данные
Требуется вывести наибольшую возрастающую подпоследовательность данной последовательности, разделяя числа пробелами. Если таких последовательностей несколько, необходимо вывести одну (любую) из них.
Примеры
входные данные
5 41 2 1 100
выходные данные
41 67 71
Мой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()      
{                                       //В этой задаче мы используем массив, в котором на i-ом месте хранится минимальное число, стоящее на i-ом месте в некоторой возрастающей подпоследовательности. В дальнейшем, под подпоследовательностью мы будем подразумевать возрастающую подпоследовательность
    long long n, a1, k, b, m;
    cin >> n >> a1 >> k >> b >> m;
    vector<long long> a(n), from(m, -1), dp, ans;       //Массив from служит для восстановления ответа. Так как мы делим с остатком на m, то это значит, что числа у нас могут быть от 0 до m - 1, на i-ой позиции стоит число, стоящее перед числом i в некоторой возрастающей подпоследовательности, -1 значит, что это число стоит в начале некоторой подпоследовательности
    a[0] = a1;
    for (int i = 1; i < n; i++)
    {
        a[i] = (k * a[i - 1] + b) % m;
    }
    dp.push_back(a[0]);
    for (int i = 1; i < n; i++)
    {
        auto it = lower_bound(dp.begin(), dp.end(), a[i]);
        if (it == dp.begin())
        {
            dp[it - dp.begin()] = a[i];
        }
        else if (it == dp.end())
        {
            from[a[i]] = dp[dp.size() - 1];
            dp.push_back(a[i]);
        }
        else
        {
            if (a[i] != dp[it - dp.begin()])           //Если мы встречаем число, которое до этого уже встречалось, то мы не обновляем from, потому что множество подпоследовательностей от второго числа - подмножество множества подпоследовательностей от первого числа
            {
                from[a[i]] = dp[it - dp.begin() - 1];
            }
            dp[it - dp.begin()] = a[i];
        }
    }
    long long x = dp[dp.size() - 1];
    while (from[x] != -1)
    {
        ans.push_back(x);
        x = from[x];
    }
    ans.push_back(x);
    for (auto it = ans.rbegin(); it != ans.rend(); it++)
    {
        cout << *it << " ";
    }
}
Я где-то допустил ошибку в этой программе. Мне НЕ нужно правильное решение, я знаю как по-другому и красивее можно все реализовать. Но я хочу понять, что в моей программе не так, чтобы не допускать таких ошибок в дальнейшем. Пожалуйста, помогите
P.s. Нужно найти и восстановить строго возрастающую подпоследовательность
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.12.2020, 20:24
Ответы с готовыми решениями:

наибольшая общая подпоследовательность с восстановлением ответа
#include &lt;bits/stdc++.h&gt; using namespace std; int main() { ios_base::sync_with_stdio(0); int n, m; cin &gt;&gt; n; ...

Наибольшая возрастающая подпоследовательность за O(NlogN)
Здравствуйте! Вот тут написал код НВП за О(NlogN).Но на тестирующей системе он выдает на тесты некоторые неправильные ответы.Тестов я...

Наибольшая общая подпоследовательность с восстановлением ответа
Даны две последовательности, требуется найти и вывести их наибольшую общую подпоследовательность. Формат входных данных В первой...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.12.2020, 20:24
Помогаю со студенческими работами здесь

Наибольшая возрастающая подпоследовательность
program true2; {$APPTYPE CONSOLE} uses SysUtils; const n=5; plusinf=88; minusinf=-88;

Наибольшая возрастающая подпоследовательность
Наибольшая возрастающая подпоследовательность У вас есть массив чисел длиною &quot;N&quot;. Нужно найти следующую длину наибольшей...

Наибольшая возрастающая подпоследовательность
Дна последовательность, нужно найти её наибольшую возрастающую подпоследовательность. Входные данные: N- длина...

Наибольшая возрастающая подпоследовательность (LIS)
Доброго времени суток! Я не сильно разбираюсь в шарпе(совсем) и при выполнении одного задания возникли некоторые трудности. Само...

Наибольшая возрастающая четночередующаяся подпоследовательность
Всем доброго времени суток. Задачка следующая. Дан массив с известным числом элементов до 3000. Необходимо найти длину наидлинейшей...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru