先了解一下離散化的概念,把無限空間中有限的個體映射到有限的空間中去,以此提高算法的時空效率。
就是他要求上限是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。
關於特殊情況的處理,還需要自己多做題。