對於值域比較大(0-10^9),對於這些值,我們需要把他們當成下標來做,我們可以把它對映到從1開始連續的陣列之中儲存
假設:a = //a有序
對映之後 1->0 3->1 100->2 2000->3 5000000->4
問題:a中可能存在重複元素 所以需要去重
vector<
int>a;
//儲存所有待離散化的值
sort
(a.begin()
,a.end()
);//排序
a.erase
(unique
(a.begin()
,a.end()
),a.
end())
;//去重
如何算出某個數x離散化後的值 二分
int
find
(int x)
return r+1;
}
#include
#include
#include
using
namespace std;
const
int n =
3e5+10;
int n,m;
int a[n]
,s[n]
;typedef pair<
int,
int>pii;
vector<
int>alls;
vectoradd,query;
intfind
(int x)
return r+1;
}int
main()
); alls.
push_back
(x);
//座標扔進來
}for
(int i=
0;i; alls.
push_back
(l);
alls.
push_back
(r);
}//去重
sort
(alls.
begin()
,alls.
end())
; alls.
erase
(unique
(alls.
begin()
,alls.
end())
,alls.
end())
;//將c插入進座標中
vector
::iterator it = add.
begin()
;for
(;it!=add.
end(
);it++
)for
(int i=
1;i<=alls.
size()
;i++
)s[i]
=s[i-1]
+a[i];
vector
::iterator itt = query.
begin()
;for
(;itt!=query.
end(
);itt++
)return0;
}
演算法筆記 離散化
離散化,就是把一些很離散的點給重新分配。舉個例子,如果乙個座標軸很長 1e10 給你1e4個座標,詢問某乙個點,座標比它小的點有多少。很容易就知道,對於1e4個點,我們不必把他們在座標軸上的位置都表示出來,因為我們比較有多少比它小的話,只需要知道他們之間的相對大小就可以,而不是絕對大小,這,就需要離...
基礎演算法 離散化
離散化主要是通過建立乙個對映,將分散的元素的位置對映成連續的位置以節約空間。說明 x為題目要進行操作的陣列元素的下標,y為經過離散化後的下標。原理 若不離散化,則針對該例需要開乙個大小為9000000的陣列儲存操作結果!通過建立乙個對映陣列來儲存所有要進行操作的下標x,然後將其排序去重,每次操作x位...
演算法 離散化 離散化的簡單實現與運用
有一些數值的絕對數值過大,但是資料個數相對較小,為了方便統計,且需要去重,我們引入了離散化這一概念。在離散化中,每乙個絕對數值都對應的對映乙個離散數值。例如有n 3時有三個數 這三個數的絕對數值較大,但是n較小,如果題目對絕對數值對答案沒有意義只是起到了相對大小的比較或者統計的作用,我們可以吧這三個...