1. 程式人生 > 實用技巧 >lower_bound實現離散化

lower_bound實現離散化

今天學習了一些新的東西,我也不知道該怎麼說,突然發現離散化居然可以這麼玩,還是非常有意思的,下面我先放一個傳統的離散化程式碼,沒有學過的同學們相信經過一番腦補也應該可以知道這個東西是用來幹什麼的,但是這不是我們今天的重點!

程式碼如下:

#include<bits/stdc++.h>
using namespace std;
struct sd{
    int val,loc;//val是值 loc是當前點的位置 
}x[100005]; 
bool cmp(sd a,sd b)
{
    if(a.val<b.val)
    return true;
}
int discretization[100005];//這單詞真夠長 
int main()
{
    std::ios::sync_with_stdio(false);
    int n;
    cin>>n;
    for(int i=1;i<=n;++i)
    {
        cin>>x[i].val;
        x[i].loc=i;
    }
    sort(x+1,x+n+1,cmp);
    int cnt=0; 
    x[0].val=891881292;//important!
    for(int i=1;i<=n;++i)
    {
        if(x[i-1].val==x[i].val)discretization[x[i].loc]=cnt;
        else 
        {
            cnt++;
            discretization[x[i].loc]=cnt;
        }
    } 
    for(int i=1;i<=n;++i)
    {
        cout<<discretization[i]<<" ";
    }
    return 0;
} 

是不是感覺思路雖然簡單但是程式碼特別長······

所以今天我們的重點出來瞭如何用lower_bound來實現離散化操作。

沒學過lower_bound的小朋友請戳這裡☞lower_bound與upper_bound的使用注意事項

說白了一句話總結一下就是lower_bound返回的就是當前你要查詢元素的第一個位置(注意:已經是排好了順序的哦!!!)

所以說我們在這裡實現這個操作就比較簡單了,我們先把原陣列複製到一個新的陣列中,然後對新的陣列實現排序和去重(沒有學過去重嗎?戳這裡☞去重unique)的工作,最後我們把原陣列中的每一個樹依次用lower_bound來搜尋他在新陣列中的位置,最後我們在用這個位置資訊更新一下原陣列,那麼一個離散化的操作就這樣完成了,我再也不用寫結構體啦!哈哈!

實現程式碼如下:

#include<bits/stdc++.h>
using namespace std;
const int N=100000;
int arr[N];
int xs[N],cnt=-1;
int n;
int main()
{
	std::ios::sync_with_stdio(false);
	cin>>n;
	for(int i=1;i<=n;++i)
	{
		cin>>arr[i];
		cnt++;
		xs[cnt]=arr[i];
	} 
	sort(xs,xs+cnt);
	int e=unique(xs,xs+cnt)-xs;
	for(int i=1;i<=n;++i)
	{
		arr[i]=lower_bound(xs,xs+e,arr[i])-xs+1;  
	}
	for(int i=1;i<=n;++i)
	{
		cout<<arr[i]<<" "; 
	}
} 

謝謝採納!