離散化 kuangbin線段樹專題總結(2)

2021-10-01 13:04:09 字數 2784 閱讀 2277

poj 2528 mayors』s posters

離散的話常用到unique函式,比如乙個vector或者普通陣列裡面存了很多座標,我們先sort一下,再用unique函式去重

unique函式返回的應該是乙個指標,指標前面都是去重好的元素,後面是重複的元素

//這樣可以得到元素個數

sort

(a,a+tot)

;//a是陣列

int m =

unique

(a,a+tot)

-a;//但一般這樣用

sort

(v.begin()

,v.end()

);v.erase

(unique

(v.begin()

,v.end()

),v.

end())

;//這樣v裡面就只剩下離散化後的座標了。。這在掃瞄線上應該很常見

回到這個題上,要區間染色和區間查詢染色種類數

好像這種染色常常出現在什麼舞會安排上。。洛谷上好像有這麼一道題

但是這道題的離散不能直接裸著來,有個問題是對於

先後插入三張海報 (1,5)、(0,3)、(4,5)

直接離散化後 (1,4)、(0,2)、(3,4)

我們可以看到實際上第二張和第三張是沒有把第一張完全覆蓋住的

但直接離散化會使得操作起來就是被完全覆蓋了

對此我們在離散化後,兩個相鄰的座標中多插乙個點,以避免這種考慮不全的情況

具體操作如下

sort

(a,a+tot)

;int m =

unique

(a,a+tot)

-a;//一般來說離散化都要去重 sort後用unique函式很巧妙地實現了

int t = m;

for(

int i=

1;i)

最後直接正常的線段樹染色即可啦

emmm。。忘了一點,離散化後相當於存在一種對映關係(實際上離散化就是一種對映)

這時建樹肯定用的是離散化後的座標,但實際查詢的是離散化前的真實座標,於是在查詢或者更新的時候就需要注意比較關係了。

有多種解決方法:

①先把輸入的真實值在離散化的陣列中二分查詢找到對應的離散後的座標,然後再代入update或query函式

②直接把真實值代入update或query函式,但是比較區間的時候一定要注意給離散化後的區間在對映回真實值。比如說對於mid,在不離散的時候就直接和給定的l,r對比就行了,但離散後應該這樣對比v[mid]和l,r對比,v[k]是第k個座標的真實值

//神奇的離散化方法  別忘了插點

//神奇的unique方法

//線段樹染色

#include

#include

#include

using

namespace std;

const

int maxn =

1e5+10;

int tree[maxn<<4]

;//對比純陣列和結構體儲存資料的區別

int a[maxn<<2]

;int l[maxn]

,r[maxn]

;bool vis[maxn<<2]

;int n,ans;

void

push_down

(int id,

int l,

int r)

}void

update

(int id,

int stl,

int str,

int l,

int r,

int c)

push_down

(id,stl,str)

;int mid =

(stl+str)

>>1;

if(r<=mid)

update

(id<<

1,stl,mid,l,r,c)

;else

if(l>mid)

update

(id<<1|

1,mid+

1,str,l,r,c)

;else

}void

query

(int id,

int stl,

int str)

if(stl==str)

return

;push_down

(id,stl,str)

;int mid =

(stl+str)

>>1;

query

(id<<

1,stl,mid)

;query

(id<<1|

1,mid+

1,str);}

intmain()

sort

(a,a+tot)

;int m =

unique

(a,a+tot)

-a;//一般來說離散化都要去重 sort後用unique函式很巧妙地實現了

int t = m;

for(

int i=

1;i)sort

(a,a+m)

;for

(int i=

0;i) ans =0;

query(1

,1,m);

printf

("%d\n"

,ans);}

return0;

}

離散化 線段樹

題目 分析 每次1操作會往序列底加first個second,first 和 second 都是最大1e9的資料,每次2操作詢問序列中第first到第second個數的和 一開始就感覺有點像線段樹,輸入資料太大我們可以離線處理把資料離散化下,然後扔到線段樹上,維護兩個陣列 sum 區間數的值的和 nu...

資料離散化 線段樹

前言 遇到了乙個矩形面積堆疊的問題,想了很久。終於找到了方法。先做個小記,待到具體問題時再分析。資料離散化 高大上的名字,其實就是對資料的一種處理,也可以採取陣列 或者 容器 map vector。之類的來儲存。之前的ibm技術俱樂部主席競選 那道題其實就是很好的應用。有些資料本身很大,自身無法作為...

紙帶 線段樹 離散化

題目大意 每次給一段區間染色,求最後整個區間有多少種顏色 分析 用膝蓋想也知道這題線段樹可以輕鬆水過,於是出題人靈機一動,挖了個深坑,每次給的區間是左開右閉的,但題目沒說,他給了你一張圖,你們可以感受一下 於是正解wa成0分我也是很絕望的。有一點要注意一下,離散化後有些區間會並在一起,原來中間的顏色...