Просмотр источника
{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] |