140 / 50 / 2
Регистрация: 06.08.2013
Сообщений: 292
Записей в блоге: 4
1

Найти медианы на всех префиксах последовательности X длины n и вывести их сумму

13.08.2014, 19:20. Показов 1840. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В этой задаче необходимо найти медианы на всех префиксах последовательности X длины n и вывести их сумму.

Медианой последовательности из нечетного (k = 2 ⋅ l + 1) количества элементов будем называть элемент, который стоял бы на (l + 1)-ом месте, если эту последовательность отсортировать. Медианой последовательности из четного (k = 2 ⋅ l) количества элементов будем называть элемент, который стоял бы на l-ом месте, если эту последовательность отсортировать.


Помогите пожалуйста решить или подскажите при чем тут бинарная куча....
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.08.2014, 19:20
Ответы с готовыми решениями:

Даны три длины сторон треугольник. Найти медианы треугольника, сторонами которого являются медианы исходного треугольника
Даны три длины a,b,c сторон некторого треугольник. Найти медианы треугольника, сторонами которого...

Даны длины a,b и с сторон некоторого треугольника. Найти медианы треугольника, сторонами которого являются медианы исходного треугольника
Как сделать с процедурой

Найти: а) первое число в последовательности большее n б) сумму всех чисел в последовательности
Последовательность Фибоначчи образуется так: первый и второй члены последовательности равны 1,...

Вывести сумму всех подотрезков последовательности
Дана последовательность A состоящая из n целых чисел .Подотрезками последовательности 1 2 3 будут...

10
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
13.08.2014, 19:56 2
так проверь:

C++ (Qt)
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#pragma comment(linker, "/STACK:167177216")
 
#include <stdio.h>
#include <stack>
#include <math.h>
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <string.h>
#include <string>
#include <memory.h>
#include <vector>
#include <map>
#include <queue>
#include <set>
#include <time.h>
#include <cassert>
#include <cstring>
//#include <unordered_set>
 
using namespace std;
 
#define mp make_pair
#define pb push_back
#define pii pair<int, int>
#define forn(i, n) for(int i = 0; i < (int)(n); i++)
#define x first
#define y second
 
typedef long long li;
typedef long double ld;
typedef unsigned long long uli;
 
const int INF = 1e9;
const ld eps = 1e-9;
const li MOD = (li)(INF + 7);
const li INF64 = (li)(INF) * (li)(INF);
 
const int ddx[] = {-1, 1, 1, -1};
const int ddy[] = {1, 1, -1, -1};
const int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1};
const int dy[] = {0, 1, 1, 1, 0, -1, -1, -1};
const int dx4[] = {-1, 0, 1, 0};
const int dy4[] = {0, 1, 0, -1};
const int dxh[] = {-1, -1, -1, 1, 1, 1, 1, -1};
const int dyh[] = {1, -1, -1, -1, -1, 1, 1, 1};
const string dirs[] = {"RIGHT", "UP", "LEFT", "DOWN"};
 
bool in(int i, int j, int n, int m)
{
    return i >= 1 && i <= n && j >= 1 && j <= m;
}
 
int a[111111];
 
int main()
{
    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
    //freopen("errors.txt", "w", stderr);
    //ios_base::sync_with_stdio(false);
    multiset<int> small, big;
    int sz1 = 0, sz2 = 0;
 
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
 
    for(int i = 1; i <= n; i++)
    {
        if(i == 1)
            small.insert(a[i]), sz1++;
        else
        {
            int mx_small = *small.rbegin();
            if(a[i] <= mx_small)
                small.insert(a[i]), sz1++;
            else
                big.insert(a[i]), sz2++;
        }
 
        int cnt = i;
        int SZ1 = (cnt + 1) / 2;
        int SZ2 = cnt - SZ1;
 
        while(sz1 > SZ1)
        {
            multiset<int>::iterator it = small.end();
            it--;
            int val = *it;
            big.insert(val);
            small.erase(it);
            sz1--;
            sz2++;
        }
 
        while(sz1 < SZ1)
        {
            multiset<int>::iterator it = big.begin();
            int val = *it;
            small.insert(val);
            big.erase(it);
            sz1++;
            sz2--;
        }
 
        assert(sz1 - sz2 <= 1);
 
        printf("answer for prefix %d == %d\n", i, *small.rbegin());
    }
    return 0;
}
1
194 / 174 / 30
Регистрация: 10.07.2012
Сообщений: 800
13.08.2014, 20:31 3
Лучший ответ Сообщение было отмечено MihaniX как решение

Решение

будем поддерживать бинарную кучу на максимум размером https://www.cyberforum.ru/cgi-bin/latex.cgi?L/2, где https://www.cyberforum.ru/cgi-bin/latex.cgi?L - длина текущего префикса.
итерация состоит в том, что добавляется новый элемент (InsertKey), и извлекается текущий максимум (ExtractMax). размер останется необходимым, притом извлеченный элемент является медианой текущего префикса.
1
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
13.08.2014, 20:48 4
SlavaSSU,
1. Почему не следите за инклюдами?
Для Вашего примера нужны всего 3 (iostream, set и cassert).
Понимаю, что Вам лень каждый раз определять это,
но уж если приводите пример на форуме, то будьте добры убрать мусор!
2. Как целочисленной константе можно присвоить 1e9 (34 строка)?
3. Если используете iostream, то с какой стати scanf (66 и 68 строки)?
4. Злоупотребляете глобальными переменными. Кстати, я вообще не вижу причины для этого,
они нигде, кроме main не используются.
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
13.08.2014, 22:37 5
zss, 1) если это запрещено правилами форума, то покадите мне это и я не буду так делать.
2)А что с ней не так?
3 - 4) может быть и верно, но тогда Вам такой вопрос: почему начали критиковать мое решение, если сами не написали(не придумали, не захотели...) свое?
0
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
14.08.2014, 20:24 6
1. Ответ надо давать лаконично, не забивая его информацией не относящейся к теме.
2. 1e9 - это double константа, а не int
3. Обязанности у меня такие - следить за базаром.
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
14.08.2014, 20:54 7
zss, чем плохо так писать const int INF = 1e9? чем плохо писать const long double mul = 1?
0
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
14.08.2014, 21:07 8
В первом случае при преобразовании double константы 1e9 в int
может получиться 999999999 или 1000000001 из-за ошибок округления.
А во втором - ну неужели так трудно поставить точку: double mul = 1.;
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
14.08.2014, 21:16 9
Была тут тема недавно. У человека при присваивании результата функции std:ow( 10, 2 ) целому получалось 99 вместо 100. Не знаю, правда, как с преобразованием на стадии комплиции.
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
14.08.2014, 21:35 10
zss, никогда так не случалось
и даже больше скажу, некоторые пишут и так const long long INF64 = (long long)(1e18) и тоже все норм
0
0 / 0 / 0
Регистрация: 17.09.2019
Сообщений: 1
17.09.2019, 11:40 11
При всем моем уважении. Либо я тупой, либо лыжи не едут.
1) извлечение и добавление элемента будут поддерживать размер чего угодно на нулевом уровне.
2) применение функции извлечения максимума из чего угодно будет извлекать максимум, при чем тут медиана-то?

Интуитивно чувствуется, что тут и правда оптимально использовать деревья, но не очень понятно, какие? красно-черные, так как они балансируются?

Добавлено через 2 минуты
Здравствуйте! пожалуйста, объясните какое решение по итогу-то? сообщение от salam отмечено как ответ, но выше я показал, почему он неправильный.
0
17.09.2019, 11:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.09.2019, 11:40
Помогаю со студенческими работами здесь

Найти сумму положительных и сумму нечетных членов последовательности. Вывести ту сумму, которая по модулю меньше
вот задачка одна не понял как вывевсти оттуда отрицательные... Программа запрашивает кол-во...

Найти длины медианы, высоты, биссектрисы, проведенные из вершины А
Даны координаты вершин треугольника АВС. Найти длины медианы, высоты, биссектрисы, проведенные из...

Вывести сумму всех НЕчетных чисел последовательности
Ввод: последовательность чисел, оканчивающаяся на ноль Вывести: сумму всех НЕ четных чисел...

Найти сумму всех чисел последовательности, количество всех чисел последовательности
Дана непустая последовательность целых чисел, оканчивающаяся нулем. Найти: а) сумму всех чисел...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru