poj 2528 數的離散化 線段樹

2021-07-11 03:43:09 字數 1739 閱讀 5600

在一面牆上貼海報,貼的順序給出了,求最後能被看到的海報數量。

純粹的線段樹模擬題。

但資料範圍給了10^7,超記憶體了。

實際上這裡用了乙個小技巧,雖然牆的寬度是很大的,但海報數量只有10000,所以這10^7個數中真正用到的數很少,這樣的話就只需要把沒用到的數給「刪去」,剩下來的數從小到大對映為新的數,這樣空間複雜度就大大降低了。這就是數的離散化。

比如題目給的樣例:

1 4

2 68 10

3 47 10

用到的數有:1 2 3 4 6 7 8 10
可以把它們對映為:
123

4678

10123

4567

8 這樣建樹的時候只開到8就行了。

#include#include

#include

#include

using

namespace

std;

const

int maxn=20010

;int seg[maxn*2];//

線段樹的結點編號從0開始。

int lnext[maxn*2],rnext[maxn*2

];int l[maxn*2],r[maxn*2

];int

tot;

int buildtree(int ll,int

rr)

int mid=(ll+rr)>>1

; lnext[cur]=buildtree(ll,mid);

rnext[cur]=buildtree(mid+1

,rr);

seg[cur]=0

;

return

cur;

}bool add(int cur,int ll,int rr,int

val)

if(seg[cur]) return

false

;

if(ll>rr) swap(ll,rr);

if(l[cur]==ll&&r[cur]==rr)

bool s1=0,s2=0

;

int mid = (l[cur]+r[cur])>>1

;

if(ll>=mid+1

) s1 =add(rnext[cur],ll,rr,val);

else

if(rr<=mid)

s2 =add(lnext[cur],ll,rr,val);

else

if(rnext[cur]!=-1&&lnext[cur]&&seg[rnext[cur]]&&seg[lnext[cur]])

return s1||s2;

}int data[10005][2

];int y[20005],cur,ying[10000002

];int

main()

y[0]=-1

; sort(y+1,y+cur);

int cc=1

;

for(int i=1;i)

buildtree(

1,cc-1

);

for(int i=n-1;i>=0;i--)

printf(

"%d\n

",ans);

}}

POJ2528 離散化線段樹

將資料離散化在使用線段樹 有一面牆,被等分為1qw份,乙份的寬度為乙個單位寬度。現在往牆上貼n張海報,每張海報的寬度是任意的,但是必定是單位寬度的整數倍,且 1qw。後貼的海報若與先貼的海報有交集,後貼的海報必定會全部或區域性覆蓋先貼的海報。現在給出每張海報所貼的位置 左端位置和右端位置 問張貼完n...

poj 2528 線段樹 離散化

題目連線 題目大意 在一面牆上貼海報,牆很長,後面貼上去的海報要覆蓋掉之前貼上去的海報,現在向牆上逐一的貼海報,問到最後牆上可以看見的海報有幾種?方法 線段樹,離散化 include include include include using namespace std define maxn 10...

poj2528(離散化 線段樹)

題意 在1 10 7的長度上貼海報,求能看到的海報數目 解題思路 10 7無論用樸素法或線段樹解都會超時超記憶體,所以要進行離散化。所謂離散化就是把有限的個體對映到有限的空間,以此提高演算法的時空效率以這題的測試資料為例,本題的五個區間為1 4,2 6,8 10,3 4,7 10 其中10和4出現了...