淺談線段樹離散化


先了解一下離散化的概念,把無限空間中有限的個體映射到有限的空間中去,以此提高算法的時空效率。

就是他要求上限是10^9,但是可能真正用到的有用的點卻只有幾千或者幾萬而已,而如果你直接用上限來做的話,任何CPU都無法運行。

離散化在線段樹方面有着很大的用途:

比如數據過大時,建立線段樹無法開辟那么多單元,此時就要用到離散化了。

具體步驟如下:

1.sort(a,a+n)排序。將要用到的區間或者點集排序

2.unique(a,a+n)去重,返回最后那個完成去重的點往后一個位置,好像是地址,所以減一個a;

3.lower-boud(a,a+n,x)返回a[0]-a[n-1]中第一個>=x的地址,若無,返回最末端的值,即a[n];

1 for(int i=0;i<n;++i)scanf("%d",&sub[i]),a[i]=sub[i];
2     sort(sub,sub+n);
3     int size=unique(sub,sub+n)-sub;
4     for(int i=0;i<n;i++)
5     a[i]=lower_bound(sub,sub+size,a[i])-sub+1;

然后此時的建立的就是1到size的線段樹,而查詢是a中所有的值都在對應的線段樹上,

比如1,100,200,300建立的數組a 就對應這1,2,3,4

查詢1到100就是間接查詢線段樹的1-2。

關於特殊情況的處理,還需要自己多做題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM