当前位置: 首页 > news >正文

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;}
}

http://www.dtcms.com/a/603009.html

相关文章:

  • 人力资源网站怎么做品牌网站设计公司价格
  • 网站建设包含专业html修改成wordpress主题
  • 网站开发总结与未来展望网络营销推广专家
  • 柳州企业网站建设价格wordpress宽屏
  • C++11——RAII 锁封装类
  • 怎样在工商局网站做公示南宁兴宁区建设局网站
  • 自己做网站的准备工作个人网站设计html
  • 张家界建设局网站电话号码郑州最新发布
  • 宁波网站建设在哪里服务好的武进网站建设
  • 被骗去国外做网站网站推广国外的建筑设计案例网站
  • 云服务器可以建设个人网站吗网页游戏开服表1区
  • 如何在 Windows 上安装 MySQL(保姆级教程2024版)
  • havoc安装
  • 长沙网站建设排名一个网站项目几个人做
  • Go语言的安装与环境配置
  • MySQL 库表与约束
  • 新西兰签证网站开发镇江网站建设费用
  • 网站搜索引擎优化公司vue手机网站开发
  • FunRec-Task2
  • 怎么把qq空间做成企业网站技术培训学校机构
  • Elasticsearch的快照生命周期管理(SLM)与索引生命周期管理(ILM)功能
  • 中国建设银行人才招聘官方网站电商网站建设思路
  • XRecorder 2.4.6.3 |好用的录屏软件,支持少见的区域录屏和画笔功能
  • 做网站点击赚取广告费中国菲律宾大使馆官网
  • 研发管理知识库(7)什么是Gitflow?
  • 优秀品牌策划方案ppt网站建站前seo注意
  • 重庆网站排名优化教程在线制作条形码免费生成器
  • 松江做网站公司wordpress app模板
  • 免费asp主机网站东营聊城网站建设
  • ubuntu 升级nginx的详细步骤(解决高危漏洞,执行补丁脚本太多,容易出错不如升级到高版本)