标签:1919 学习 int 笔记 离散 810 序列 114514 1000
简单。
简单定义
把一些值域很大的正数映射到一个很小的范围内
适用范围
当题目中所给的数据为正数且值域很大(如,\([1,10^{19}]\))时,如果题目不要求对这些数本身进行操作并且不需要求具体的值,只需要比较它们大小的关系或其它不涉及具体数值的操作,那么可以对这个序列进行离散化处理。
离散化有一个很著名的应用就是用树状数组求逆序对。
具体做法
一个通用的做法是,把原序列复制一份到新序列里,然后把新序列排序后去重,最后通过 lower_bound 函数得到原序列中每个数的排名。
e.g.
原序列:1000 1000 114514 1919 1919 810 114514
复制、排序:810 1000 1000 1919 1919 114514 114514
去重:810 1000 1919 114514
相对排名:2 2 4 3 3 1 4
参考代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[10001],b[10001],n,m;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+n+1); //排序
m=unique(b+1,b+n+1)-b-1; //去重
for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+m+1,a[i])-b; //lower_bound函数二分查找大于等于x的第一个位置
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
return 0;
}
有时候必须去重,有时候可以不去重
然后还有一种写法,需要搞一个结构体,很麻烦。
掌握这一种写法足以应付这种题目。
标签:1919,学习,int,笔记,离散,810,序列,114514,1000 来源: https://www.cnblogs.com/BlueInRed/p/12404548.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。