C++ 离散化
C++ 离散化 代码框架见下
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;// 1 1.5 -5 20 -5 100000000
//第一步:排序 -5 -5 1 1.5 20 100000000
//第二步:去重 -5 1 1.5 20 100000000
// 映射 0 1 2 3 4template<class T>
class Dicretizer {
public:void AddData(T v);void Process();int Get(T v) const;int Size() const;
private:vector<T> m_data;
};template<class T>
void Dicretizer<T>::AddData(T v)
{m_data.push_back(v);
}template<class T>
void Dicretizer<T>::Process()
{sort(m_data.begin(), m_data.end());int lastIdx = 0;for (int i = 1; i < m_data.size(); ++i) {T x = m_data[i];if (x != m_data[lastIdx]) {m_data[++lastIdx] = x;}}while (lastIdx + 1 < m_data.size()) {m_data.pop_back();}}template<class T>
int Dicretizer<T>::Get(T v) const
{int l = -1, r = (int)m_data.size();while (l + 1 < r) {int mid = (l + r) >> 1;if (m_data[mid] >= v) {r = mid;}else {l = mid;}}// l 就是最大的小于 v的下标// r 就是最小的大于等于 v的下标if (r == m_data.size() || m_data[r] != v) {return -1;}return r;
}template<class T>
int Dicretizer<T>::Size() const
{return m_data.size();
}int a[100001];int main() {int t;while (cin >> t) {while (t--) {Dicretizer<int> d;int n;cin >> n;for (int i = 0; i < n; ++i) {cin >> a[i];d.AddData(a[i]);}d.Process();for (int i = 0; i < n; ++i) {cout << d.Get(a[i])+1 << ' ';}cout << endl;}}
}代码练习 1 对应蓝桥云课 寻找满足高度的最大山峦美丽值 代码见下
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;// 1 1.5 -5 20 -5 100000000
//第一步:排序 -5 -5 1 1.5 20 100000000
//第二步:去重 -5 1 1.5 20 100000000
// 映射 0 1 2 3 4template<class T>
class Dicretizer {
public:void AddData(T v);void Process();int Get(T v) const;int Size() const;
private:vector<T> m_data;
};template<class T>
void Dicretizer<T>::AddData(T v)
{m_data.push_back(v);
}template<class T>
void Dicretizer<T>::Process()
{sort(m_data.begin(), m_data.end());int lastIdx = 0;for (int i = 1; i < m_data.size(); ++i) {T x = m_data[i];if (x != m_data[lastIdx]) {m_data[++lastIdx] = x;}}while (lastIdx + 1 < m_data.size()) {m_data.pop_back();}}template<class T>
int Dicretizer<T>::Get(T v) const
{int l = -1, r = (int)m_data.size();while (l + 1 < r) {int mid = (l + r) >> 1;if (m_data[mid] >= v) {r = mid;}else {l = mid;}}// l 就是最大的小于 v的下标// r 就是最小的大于等于 v的下标if (r == m_data.size() || m_data[r] != v) {return -1;}return r;
}template<class T>
int Dicretizer<T>::Size() const
{return m_data.size();
}#define maxn 200001
struct HB {int h, b;
}hb[maxn];int k[maxn], maxv[maxn];bool cmp(const HB& a, const HB& b) {return a.h < b.h;
}int main() {Dicretizer<int> d;int n, q;cin >> n >> q;for (int i = 0; i < n; ++i) {cin >> hb[i].h;d.AddData(hb[i].h);}for (int i = 0; i < n; ++i) {cin >> hb[i].b;}for (int i = 0; i < q; ++i) {cin >> k[i];d.AddData(k[i]);}d.Process();for (int i = 0; i < n; ++i) {hb[i].h = d.Get(hb[i].h);}for (int i = 0; i < q; ++i) {k[i] = d.Get(k[i]);}sort(hb, hb + n, cmp);maxv[d.Size()] = -1;int j = n - 1;for (int i = d.Size() - 1; i >= 0; --i) {maxv[i] = maxv[i + 1];while (j >= 0 && hb[j].h == i) {if (hb[j].b > maxv[i]) {maxv[i] = hb[j].b;}--j;}}for (int i = 0; i < q; ++i) {int x = k[i];cout << maxv[x] << endl;}
}