首页 > 其他分享 >离散化

离散化

时间:2024-07-27 19:52:20浏览次数:16  
标签:int 重后 mid 离散 数组 排序

#include <iostream>
#include <algorithm>

using namespace std;

int* a, * d, * c, n,ctop;
//a原数组 d为排序后的数组 c为去重后的数组

int bin_search(int target) {
	int l = 1, r = ctop;
	while (l < r) {
		int mid = l + r >> 1;
		if (c[mid] >= target)r = mid;
		else l = mid + 1;
	}
	return l;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	a = new int[n + 5];
	d = new int[n + 5];
	c = new int[n + 5];
	for (int i = 1; i <= n; i++)cin >> a[i], d[i] = a[i];
	sort(d + 1, d + 1 + n);
	for (int i = 1; i <= n; i++)
		if (d[i] != d[i - 1] || i == 1)c[++ctop] = d[i];
	for (int i = 1; i <= n; i++) {
		int x = bin_search(a[i]);
		a[i] = x;
	}
	for (int i = 1; i <= n; i++)cout << a[i] << ' ';
	delete[] a;
	delete[] d;
	delete[] c;
	return 0;
}

关于离散化

就是把大的数据按大小排序后的序号重新赋值,将其映射到一个较小的空间
步骤:

  1. 排序
  2. 去重
  3. 在去重后的数组里确定原数组每个数的位置,那个位置(即下标)就是离散化后的值

说明

排序去重,即保证原数组每个数(这些数可能有重复)在步骤3中能被唯一确定或者方便获取离散化后的值
最后在去重后的数组中二分查询原数组每个数,得到下标,下标即每个数的排名,即离散化后的值。

完结散花 ❀

标签:int,重后,mid,离散,数组,排序
From: https://www.cnblogs.com/PanGZ-cabin/p/18327385

相关文章

  • 洛谷题单指南-前缀和差分与离散化-P3397 地毯
    原题链接:https://www.luogu.com.cn/problem/P3397题意解读:给定一个n*n的矩阵,每个元素初始值为0,再将m个子矩阵中的元素都增加1,统计每个元素最终的值。解题思路:1、暴力法枚举每一个子矩阵,将对应元素值加1,时间复杂度为1000^3,不可行。2、二维差分对于给定二维数组s[][],给指定区......
  • 洛谷题单指南-前缀和差分与离散化-P2367 语文成绩
    原题链接:https://www.luogu.com.cn/problem/P2367题意解读:对于数组s[],给指定q个区间[x,y]里每个数增加z,计算操作之后最小的数。解题思路:1、暴力做法对于每一个区间[x,y],枚举给每一个数增加z,然后遍历查找最小值,总体时间复杂度为O(N^2),不可行。2、一维差分对于给指定区间[x,......
  • 洛谷题单指南-前缀和差分与离散化-P1314 [NOIP2011 提高组] 聪明的质监员
    原题链接:https://www.luogu.com.cn/problem/P1314题意解读:计算m个检验值之和,计算与s差值绝对值的最小值。解题思路:1、首先要搞懂检验值是如何计算的如上图,对于每一个区间的检验值yi,表示为:yi="该区间重量>=W的矿石个数" ✖️"该区间>=W的矿石价值之和"检验值y即所有yi(1<=......
  • 洛谷题单指南-前缀和差分与离散化-P8218 【深进1.例1】求区间和
    原题链接:https://www.luogu.com.cn/problem/P8218题意解读:对于数组a[N],给定m个区间l~r,求每个区间所有元素之和。解题思路:先思考暴力做法:对于每一个区间[l,r],累加a[l]~a[r]所有元素,时间复杂度最坏为10^5*10^4,不可行。一维前缀和:设s[N]是a[N]的前缀和数组,即对于每一个s[i......
  • 数字信号||离散序列的基本运算(2)
    实验二  离散序列的基本运算一、实验目的(1)进一步了解离散时间序列时域的基本运算。(2)了解MATLAB语言进行离散序列运算的常用函数,掌握离散序列运算程序的编写方法。二、实验涉及的MATLAB子函数1.find功能:寻找非零元素的索引号。调用格式:find((n>=min(n1))&(n<=max(n1)......
  • 数字信号||离散序列的基本运算(1)
    实验一 离散序列的基本运算一、实验目的(1)了解常用的时域离散信号及其特点。(2)掌握MATLAB产生常用时域离散信号的方法。二、实验涉及的MATLAB子函数1.axis功能:限定图形坐标的范围。调用格式:axis([x1,x2,y1,y2]);在横坐标起点为x1、终点为x2,纵坐标起点为y1、终点为y2的范围......
  • 题解 B3694 数列离散化
    link简而言之,离散化就是把一个数列转化为由小到大的排名来缩小范围。离散化需要这个题不用数字本身。举个例子:-200244879914993235793离散化后就是:15243\(-2002\)最小,所以它对应\(1\)\(448799\)最大,所以它对应\(5\)实现考虑如何实现。首先由于离散化前后......
  • 离散化
    //洛谷p8218求区间和#include<iostream>usingnamespacestd;constintN=100010;intn;intm;inta[N],s[N];intmain(){ cin>>n; for(inti=1;i<=n;i++){ cin>>a[i]; s[i]=s[i-1]+a[i];} cin>>m; whil......
  • 离散化笔记汇总
    火烧赤壁题目背景曹操平定北方以后,公元208年,率领大军南下,进攻刘表。他的人马还没有到荆州,刘表已经病死。他的儿子刘琮听到曹军声势浩大,吓破了胆,先派人求降了。孙权任命周瑜为都督,拨给他三万水军,叫他同刘备协力抵抗曹操。隆冬的十一月,天气突然回暖,刮起了东南风。没想到东吴......
  • 离散数学——6.命题逻辑的应用
    命题逻辑的应用自然语言命题的符号化为什么要将自然语言命题符号化?自然语言命题转换为逻辑公式的过程也称为自然语言命题的符号化是将命题逻辑知识(等值演算和推理理论)用于求解应用问题的第一步$p→q的逆命题是q→p$$p→q的否命题是¬p→¬q$$p→q的逆否命题是¬q→¬p$......