Рабочий стол > DL Руководство пользователя > ... > Полезные факты о С++ и примеры задач > Множества > Information > Сравнить страницу
Множества Войти | Зарегистрироваться   Просмотр версии для печати текущей страницы.

Ключ
Эти линии были удалены. Это слово было удалено.
Эти линии были добавлены. Это слово было добавлено.

Просмотр истории страницы


Есть 0 изменений. Просмотреть первое изменение .

 {quote}
 set - множество - хранит упорядоченные по возрастанию элементы в виде дерева каждый ровно один раз
 multiset - мультимножество - хранит упорядоченные по неубыванию элементы в виде дерева
 каждый элемент может встречаться несколько раз
 {quote}
 Объявление
 {quote}
 set<string> s; // множество строк, строки упорядочены по возрастанию
 // добавление одинаковых игнорируется
 // каждое строка может встречаться один раз
 multiset<int, greater<int> > s; // множество чисел, числа упорядочены по убыванию
 // одинаковые числа добавляются
 // каждое число может встречаться несколько раз
 {quote}
 Использование
 {quote}
 s.insert(t) // вставить элемент t в множество s
 s.find(t) // найти t в s
 проверить, есть ли элемент t во множестве s
 нет, если s.find(t)==s.end()
 есть, если s.find(t)\!=s.end()
 s.end - адрес "сразу за последним элементом "
 s.erase(s.find(h)) // найти в s элемент h и удалить его
 s.erase(h) // в multiset удаляет все элементы со значением h
 s.clear() // удалить все элементы из s
 s.empty() // множество пустое?
 s.size() // количество элементов в s
  
 \*s.begin() // взять первый - наименьший элемент из s (если элементы хранятся по возрастанию)
 // - наибольший элемент из s (если элементы хранятся по убыванию)
 \*s.rbegin() // взять последний
 \*--s.end() // взять последний - наибольший элемент из s (если элементы хранятся по возрастанию)
 // - наименьший элемент из s (если элементы хранятся по убыванию)
 // s.end - адрес "сразу за последним элементом"
 {quote}
 Заметим, что первый, последний элементы и empty берутся за O(1),
  
 а insert, find, erase выполняются за O(LogN)
 {code:title=part.cpp|borderStyle=solid}
 set <pair< pair<int,int> , pair<int,int> > > s; // множество четвёрок чисел
 set <pair< pair<int,int> , pair<int,int> > >::iterator is; // итератор по множеству
 for (is=s.begin(); is!=s.end(); is++)
 for (is=s.begin(); is!=s.end(); is++)
  {
  int x1,y1,x2,y2;
  x1=is->first.first; // обращение к элементам четвёрки
  y1=is->first.second; // с помощью итератора
  x2=is->second.first;
  y2=is->second.second;
 {code}
 Задача из курса "Методы алгоритмизации"
 Олимпиады по информатике\Стек\07_Rub6 - "aPhone
 [http://dl.gsu.by/task.jsp?nid=256579&cid=15]
  
 Решение
  
 Можно симулировать процесс, описанный в условии задачи.
  
 А можно заметить, что если сначала все строки прочитать,
 а потом обрабатывать их с конца, то задача может существенно упроститься
 Список строк пустой
 Пока не обработали все строки
 - если текущей строки нет,
 Тогда выводим её, и заносим её в список
 иначе пропускаем
 Довыводим <Empty> если нужно
  
 Для того, чтобы не писать самим процедуры
 добавления строки в список проверки и проверки наличия строки в списке
 (а также для ускорения этих процедур) можно
 определить тип множество строк (set<string> s)
 и использовать стандартные функции.
 s.insert(t) - вставить строку t в множество s
 s.find(t) - проверить, есть ли строка t во множестве s
 есть, если s.find(t)==s.end()
 {code:title=prog.cpp|borderStyle=solid}
 #include <bits/stdc++.h>
 using namespace std;
 string x[1000];
 set<string> s;
 int main()
 {
  freopen("aphone.in","r",stdin);
  freopen("aphone.out","w",stdout);
  int n,m,i;
  cin >> m >> n;
  for (i=0; i<n; i++) cin >> x[i];
  for (i=n-1; (i>=0) && (m>0); i--)
  if (s.find(x[i])==s.end())
  { s.insert(x[i]); cout << x[i] << endl; m--;};
  for (i=0; i<m; i++) cout << "<Empty>" << endl;
 }
 {code}
 Подробнее о set
 [http://informatics.mccme.ru/mod/book/view.php?id=492&chapterid=215]
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: http://www.atlassian.com/software/confluence Build:#2.6.1 916) - Ошибка/новая особенность - Свяжитесь с Администраторами