先介紹一下離散化 桶排大家應該知道,就是開乙個陣列(下標為數值,記錄了該數值的出現次數)然後遍歷過去如果出現次數不為零,那就輸出這些數字,理論時間複雜度可以達到o(n)但是由於記憶體限制,不能開很大的陣列。
然而 如果某個數列中的數字不要求大小確定,只要求這些數字有相對的大小就夠了的話,離散化就有了用武之地(換言之,如果乙個數的大小在1e9上下,那我們可以用離散化來比較。。)
舉個例子:數列
3 8 7 5 2000000000000000我們發現有幾個數之間差距很大,但是我們用不到數值的大小,只要求相對大小,那怎麼辦呢? 觀察下面的數列:
1 4 3 2 5真巧,這個數列和上面的數列各個數字之間的相對大小是一樣的並且,讓很大的資料縮小了,這樣離散化了之後就可以處理一些原本處理不了的問題
離散化比較ok的複雜度是o(nlogn) stl**好,**見下:
for
(int i=
1;i<=n;
++i)
a[i]
=read()
,b[i]
=a[i]
;//讀入陣列a,b陣列記錄下,等會兒用(read是讀入優化)
sort
(b+1
,b+n+1)
;//排序b陣列,避免a陣列順序打亂
int len=
unique
(b+1
,b+n+1)
-b-1
;//unique:stl自帶函式,去重並返回去重後陣列的長度+1(所以這裡後面要-1)
//(原理上來講不是這樣,但這樣理解方便)
for(
int i=
1;i<=n;
++i)
讀入流在一定程度上是縮小了時間的,洛谷p1908我加了io都被卡時間,讀入流就很方便,加速優化。
inline
intread()
while
(isdigit
(chr)
)return ans*f;
}
—————————————分割線————————————————————
還是以洛谷p1908為例。
其實就是把權值作為下標,進行插入。一般需要離散化,不然會mle
線段樹大概地球人都知道了,就是以陣列的下表建立線段樹來進行一些區間操作,這裡介紹一下權值線段樹,顧名思義,其實權值線段樹也是線段樹的一種。
一:權值線段樹線段樹與簡單線段樹的區別就像他的名字一樣,他的葉子節點存的並不是陣列的下表,而是陣列中數的權值,這種操作很簡單的解決一些問題。
#include
#include
#include
#include
#define lson i << 1
#define rson i << 1 | 1
#define m 40005
using
namespace std;
inline
intread()
while
(isdigit
(chr)
)return ans*f;
}int n;
struct nodet[m<<2]
;int a[m]
,b[m]
;void
kai(
)void
push_up
(int i)
//向上更新
void
build
(int i,
int l,
int r)
int mid=t[i]
.l+t[i]
.r>>1;
build
(i<<
1,l,mid)
;build
(i<<1|
1,mid+
1,r);}
void
updata
(int i,
int x)
int mid=t[i]
.l+t[i]
.r>>1;
if(x<=mid)
updata
(lson,x)
;else
updata
(rson,x)
;push_up
(i);
}//更新節點
intquery
(int i,
int l,
int r)
//詢問
intmain()
//離散化
for(
int i=
1;i<=n;
++i)
printf
("%d"
,ans)
;return0;
}
資料結構 可持久化權值線段樹
解決靜態區間第k小的問題。include using namespace std const int maxn 2e5 5 int tot,n,m int sum maxn 5 rt maxn ls maxn 5 rs maxn 5 int a maxn ind maxn len inline in...
( 資料結構專題 ) 權值線段樹
資料結構專題 權值線段樹 學習權值線段樹,首先要了解線段樹是什麼。如果不會的可以先學習一下。權值線段樹,顧名思義是一棵線段樹。但它和普通線段樹不同 線段樹,每個節點用來維護一段區間的最大值或總和等。權值線段樹,相當於乙個桶,每個節點用來表示乙個區間的數出現的次數。我們可以用它來維護一段區間的數出現的...
資料結構入門 線段樹plus 權值線段樹
目錄 2.0 部分 實現 3.0 例題 p1168 中位數 更新日誌及說明 若並未學會,建議進入以下相應博文先行學習前置知識 資料結構入門 線段樹 發表於 2019 11 28 20 39 dfkuaid 摘要 線段樹的基本 建樹 區間查詢 單點修改 及高階操作 區間修改 單點查詢 區間修改 區間查...