TGViewer
Поступашки - Информатика Поступашки - Информатика @postupashki_prog · 1.75K subscribers
Post #139 4.07K
Здравствуйте, товарищи, давно не виделись! 🦖
Сегодня у нас на разборе такая тема как Сжатие координат.

Идея
Часто бывает полезно преобразовать последовательность чисел либо каких-то других объектов в промежуток последовательных целых чисел. К примеру, чтобы использовать её элементы как индексы в массиве либо какой-нибудь другой структуре.

Эта задача эквивалентна нумерации элементов множества, что можно сделать за O(n) через хеш-таблицу:
vector<int> compress(vector<int> a) {
unordered_map<int, int> m;

for (int &x : a) {
if (m.count(x))
x = m[x];
else
m[x] = m.size();
}

return a;
}

Элементам будут присвоены номера в порядке их первого вхождения в последовательность. Если нужно сохранить порядок, присвоив меньшим элементам меньшие номера, то задача становится чуть сложнее, и её можно решить разными способами.

Как вариант, можно отсортировать массив, а затем два раза пройтись по нему с хэш-таблицей. Сначала заполняем её, а во второй раз сжимаем сам массив
vector<int> compress(vector<int> a) {
vector<int> b = a;
sort(b.begin(), b.end());

unordered_map<int, int> m;

for (int x : b)
if (!m.count(x))
m[x] = m.size();

for (int &x : a)
x = m[x];

return a;
}


Также можно выкинуть из отсортированного массива дупликаты, а затем использовать его для нахождения индекса каждого элемента исходного массива бинарным поиском
vector<int> compress(vector<int> a) {
vector<int> b = a;

sort(b.begin(), b.end());
b.erase(unique(b.begin(), b.end()), b.end());

for (int &x : a)
x = int(lower_bound(b.begin(), b.end(), x) - b.begin());

return a;
}


Оба подхода работают за O(n log n)

Практика
Площадь прямоугольников
Прямоугольное деление
Закраска прямой - 2
Бал

Пишите в комментарии, какую тему нам разобрать следующей😎


@postupashki_prog
More from @postupashki_prog
  1. Sep 30, 2026Здравствуйте, камрады 😎 Сегодня прокачанная версия бинпоиска по ответу — параллельный бин…
  2. Sep 27, 2026Олимпиады по информатике 2026/27: сколько теперь реально стоит диплом Здравствуйте, камрад…
  3. Sep 21, 2026💻 Камрады, а вы знали, что БВИ на программную инженерию можно было получить по экономике?…
  4. Sep 7, 2026Здравствуйте, товарищи😎 Сегодня разбираем один из самых частотных приёмов - бинарный поис…
  5. Jul 7, 2026Появился новый бот со шпаргалками и бесплатными материалами для подготовки к ОГЭ и ЕГЭ 😱…
  6. Jul 6, 2026Convex Hull Trick Сегодня обсудим одну из самых краисвых техник в алгоритмическом программ…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →