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

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

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


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

 {quote}set - множество - хранит упорядоченные по возрастанию элементы в виде дерева каждый ровно один раз
  {quote}
 set - множество - хранит упорядоченные по возрастанию элементы в виде дерева каждый ровно один раз
 multiset - мультимножество - хранит упорядоченные по неубыванию элементы в виде дерева
каждый элемент может встречаться несколько раз{quote}
  
  каждый элемент может встречаться несколько раз
 {quote}
 Объявление
 
 {quote}set<string> s; // множество строк, строки упорядочены по возрастанию
 // добавление одинаковых игнорируется
 // каждое строка может встречаться один раз
  {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 - адрес "сразу за последним элементом "
  проверить, есть ли элемент 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}
  
  
  \*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}
  
  
  
  
  
   y2=is->second.second;
 {code}
 Задача из курса "Методы алгоритмизации"
 Олимпиады по информатике\Стек\07_Rub6 - "aPhone
http://dl.gsu.by/task.jsp?nid=256579&cid=15
  [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()
  
  есть, если 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}
  
  }
 {code}
 Подробнее о set
 http://informatics.mccme.ru/mod/book/view.php?id=492&chapterid=215
  [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) - Ошибка/новая особенность - Свяжитесь с Администраторами