Задача

1 /10


Множества в C++

Теория Нажмите, чтобы прочитать/скрыть


Множества (set) в C++

Множество (set) — это контейнер, который автоматически сортирует добавляемые элементы в порядке возрастания. Но при добавлении одинаковых значений, set будет хранить только один его экземпляр (multiset - мультимножество - может содержать дубликаты). При добавлении нового элемента в множество, он сразу становится на свое место так, чтобы не нарушать порядка сортировки.  

Множества на языке C++ определены в стандартной библиотеки шаблонов STL через класс set (multiset).

В основе множеств лежат бинарные красно-черные деревья. Операции поиска, удаления и вставки имеют логарифмическую сложность.
 
Для использования множеств необходимо подключить библиотеку “set”:
#include <set>

Объявление множества:
set<int> mySet; // Объявление пустого множества.

multiset<int> mySet; // Объявление пустого мультимножества.
 
Функции работы с множеством (set)
 
empty() - проверяет отсутствие элементов в контейнере
 
size() - Возвращает количество элементов в контейнере
 
clear() - Очищает контейнер
 
insert() - Вставляет элементы
 
erase() - Удаляет элементы
 
count() - Возвращает количество элементов, соответствующих определенному ключу
 
find() - Находит элемент с конкретным ключом
 
lower_bound() - Возвращает итератор на первый элемент не менее, чем заданное значение
 
upper_bound() - Возвращает итератор на первый элемент больше, чем определенное значение
 

 
Пример использования множества и мультимножества
#include <iostream>
#include <set>

using namespace std;

int main()

{

    set<int> mySet1; // объявили пустое множество
    multiset<int> mySet2; // объявили пустое мультимножество

    // добавляем элементы в множество
    mySet1.insert(1);
    mySet1.insert(2);
    mySet1.insert(3);
    mySet1.insert(1);

    // добавляем элементы в мультимножество
    mySet2.insert(1);
    mySet2.insert(2);
    mySet2.insert(3);
    mySet2.insert(1);

    set<int>::iterator it; //создание итератора
    for(it = mySet1.begin(); it != mySet1.end(); it++) { // Вывод всех элементов
        cout << (*it) << " "; // множества
    }

    cout << endl;

    for(it = mySet2.begin(); it != mySet2.end(); it++) { // Вывод всех элементов
        cout << (*it) << " "; // мультимножества
    }

    return 0;
}

Задача

Входные данные
Дано число N (1 <= N <= 100000) – кол-во запросов. В следующих N строках содержится символ ‘+’ или ‘-’ и число a (1 <= a <= 1000000000). Если символ – ‘+’, то число a добавляется в множество, иначе – удаляются все значения a, которые были добавлены ранее.
Гарантируется, что при удалении числа, оно содержится в множестве.

Выходные данные
Требуется вывести в порядке возрастания все уникальные элементы в множестве после выполнения всех запросов или «-1», если в множестве нет элементов.

 
Примеры
Входные данные Выходные данные
1
3
+ 1
+ 2
- 1
2
2
3
+ 1
+ 1
- 1
-1
3
3
+ 1
+ 1
+ 1
1

time 1000 ms
memory 256 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
 Кол-во
С++ Mingw-w64243
Комментарий учителя