poj2528線段樹 離散化

2021-07-23 22:33:38 字數 1361 閱讀 5611

貼海報,問你最後沒有被完全覆蓋的海報有幾個?

這個題是我假期時候做的,當時沒找到靠譜題解,自己也不會敲,感謝kuangbin大神好幾年前發的題解,終於徹底想通了這道題。

首先,因為數字很大,需要離散化

離散化 的大概思路 : 比如說給你一組 資料 1 4 1000 100000, 如果直接

開線段, 顯然是浪費, 那麼我們只要 進行 對映 :

1 1

4 2

1000 3

100000 4

接下來 我們只要對 1 2 3 4 建立線段樹就行了 只需要[1,4]的區間。進行建樹即可

#include

#include

#include

using

namespace

std;

const

int maxn = 10010;

struct cpostposters[maxn];

int x[maxn*2];

int hash[10000005];

struct nodesegtree[maxn * 8];

void build(int i , int l , int r)

bool post(int i , int l , int r)

bool bresult;

int mid = (segtree[i].l + segtree[i].r) >> 1;

if(r <= mid) bresult = post(i << 1 , l , r);

else

if(l > mid)

bresult = post(i << 1 | 1 , l , r);

else

if(segtree[i << 1].covered && segtree[i << 1|1].covered)//如果兩個兒子都被覆蓋則被覆蓋

segtree[i].covered = true;

return bresult;

}int main()

sort(x , x + ncount);

ncount = unique(x , x + ncount) - x;//離散化

for(int i = 0 ; i < ncount ; i++) hash[x[i]] = i;//把每乙個點都都對映一下

build(1 , 0 , ncount - 1);//因為是hash從0開始,所以建樹要從0開始建

int res = 0;

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

printf("%d\n",res);

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