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

离散化算法总结

离散化是将大范围的数字映射到小范围的区间内,适用于稀疏的区间。

两个问题需要考虑:

1. 原数组中可能有重复元素,需要去重。

2. 如何算出离散化后的值(离散化后保序,使用二分)。

题目链接:

https://www.acwing.com/problem/content/804/

代码:

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;typedef pair<int, int> PII;const int N = 300010;int n, m;
int a[N], s[N];vector<int> alls;
vector<PII> add, query;int find(int x)
{int l = 0, r = alls.size() - 1;while (l < r){int mid = l + r >> 1;if (alls[mid] >= x) r = mid;else l = mid + 1;}return r + 1;
}int main()
{cin >> n >> m;for (int i = 0; i < n; i++){int x, c;cin >> x >> c;add.push_back({x, c});alls.push_back(x);}for (int i = 0; i < m; i++){int l, r;cin >> l >> r;query.push_back({l, r});alls.push_back(l);alls.push_back(r);}// 去重sort(alls.begin(), alls.end());alls.erase(unique(alls.begin(), alls.end()), alls.end());// 处理插入for (auto item : add){int x = find(item.first);a[x] += item.second;}// 预处理前缀和for (int i = 1; i <= alls.size(); i++) s[i] = s[i - 1] + a[i];// 处理询问for (auto item : query){int l = find(item.first), r = find(item.second);cout << s[r] - s[l - 1] << endl;}return 0;
}

其中,unique(alls.begin(), alls.end())将数组中的所有重复元素去重,返回去重后的数组的尾端点。使用Java和Python的小伙伴可以使用下列自己实现的方法替换(双指针算法):

vector<int>::iterator unique(vector<int>& a)
{int j = 0;for (int i = 0; i < a.size(); i++)if (!i || a[i] != a[i - 1])a[j++] = a[i];// a[0] ~ a[j - 1] 所有a中不重复的数return a.begin() + j;
}

http://www.lryc.cn/news/251247.html

相关文章:

  • 【海思SS528 | VO】MPP媒体处理软件V5.0 | VO模块编程总结
  • 逻辑卷管理器lvm
  • 函数声明后的“ - >”是什么?
  • 51爱心流水灯32灯炫酷代码
  • 将不同时间点的登录状态记录转化为不同时间段的相同登录状态SQL求解
  • 正则表达式与SQL数据库教程
  • HTML_web扩展标签
  • 论文阅读:Distributed Initialization for VVIRO with Position-Unknown UWB Network
  • scrapy爬虫中间件和下载中间件的使用
  • 手敲单链表,简单了解其运行逻辑
  • Redis RDB
  • Elasticsearch一些函数查询
  • 竞赛选题 : 题目:基于深度学习的水果识别 设计 开题 技术
  • Linux expect命令详解
  • ubuntu18编译Android8的Failed to contact Jack server问题
  • FindSecBugs支持的检测规则
  • 【WPF.NET开发】WPF.NET桌面应用开发概述
  • 态势感知是什么
  • Spring MVC常用的注解, Controller注解的作用,RequestMapping注解的作用 @ResponseBody注解的作用
  • 「Verilog学习笔记」自动贩售机1
  • 【大模型】更强的 ChatGLM3-6B 来了,开源可商用
  • Maxscript到Python转换工具教程
  • Spark_日期参数解析参数-spark.sql.legacy.timeParserPolicy
  • C语言之结构体
  • 【蓝桥杯软件赛 零基础备赛20周】第5周——高精度大数运算与队列
  • C#:程序发布的大小控制
  • Python中的split()、rsplit()、splitlines()的区别
  • 上位机开发框架:QT与winform/wpf对比
  • Halcon tiff 点云读取以及平面矫正
  • 详解Spring中基于注解的Aop编程以及Spring对于JDK和CGLIB代理方式的切换