sotanishy's code snippets for competitive programming
View the Project on GitHub sotanishy/cp-library-cpp
#include "misc/compress.hpp"
#pragma once #include <algorithm> #include <vector> /** * @brief Coordinate Compression */ template <typename T> class Compress { public: Compress() = default; explicit Compress(const std::vector<T>& vs) : xs(vs) { std::ranges::sort(xs); xs.erase(std::ranges::unique(xs).begin(), xs.end()); } int compress(const T& x) const { return std::ranges::lower_bound(xs, x) - xs.begin(); } std::vector<int> compress(const std::vector<T>& vs) const { std::vector<int> res(vs.size()); std::ranges::transform(vs, res.begin(), [&](const T& x) { return compress(x); }); return res; } T decompress(int i) const { return xs[i]; } int size() const { return xs.size(); } private: std::vector<T> xs; };
#line 2 "misc/compress.hpp" #include <algorithm> #include <vector> /** * @brief Coordinate Compression */ template <typename T> class Compress { public: Compress() = default; explicit Compress(const std::vector<T>& vs) : xs(vs) { std::ranges::sort(xs); xs.erase(std::ranges::unique(xs).begin(), xs.end()); } int compress(const T& x) const { return std::ranges::lower_bound(xs, x) - xs.begin(); } std::vector<int> compress(const std::vector<T>& vs) const { std::vector<int> res(vs.size()); std::ranges::transform(vs, res.begin(), [&](const T& x) { return compress(x); }); return res; } T decompress(int i) const { return xs[i]; } int size() const { return xs.size(); } private: std::vector<T> xs; };