POJ 2528 線段樹 離散化

2022-03-12 14:18:43 字數 1244 閱讀 3458

poj 2528

關鍵在於插入資料的順序------從上往下依次插入每張海報,這樣後插入的海報不可能覆蓋先插入的海報,因此插入一張海報時,如果發現海報對應區間有一部分露出來,就說明該海報部分可見。

#include 

#include

using

namespace std;

struct cpost;

cpost posters[10100]; //

儲存海報

int x[20200]; //

儲存端點編號

int hash[10000010]; //

儲存離散後的端點的編號,端點的大小為1qw,所以要大。

struct cnode;

cnode tree[1000000];

int nnodecount=0;

int mid(cnode *proot)

void create(cnode *proot,int l,int r)

bool query(cnode* proot,int l,int r)

bool bresult;

if(l>=mid(proot)+1)

else

if(r<=mid(proot))

else

//需要更新根節點的覆蓋情況

if(proot->pleft->bcovered && proot->pright->bcovered)

proot->bcovered=true;

return bresult;

}int main()

sort(x,x+ncount);

ncount=unique(x,x+ncount)-x;//

unique返回的是去除重複後的,不重複那部分的最後乙個位置

//離散化

int ninterval=0;

for(int j=0;j//

hash[x[j]]=ninterval;

/*if( i < ncount -1)

*/hash[x[j]]=ninterval;

ninterval++;

}create(tree,0,ninterval); //

從零開始

int sum=0;

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

printf("

%d\n

",sum);

}return

0;}

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出現了...