poj2528 (線段樹 離散化)

2022-08-02 06:09:12 字數 1578 閱讀 3007

傳送門::

題意: 在牆上貼海報,海報可以互相覆蓋,問最後可以看見幾張海報

資料:1 <= i <= n, 1 <= li

<= ri <= 10000000;1 <= n <= 10000

思路:離散化+線段樹

離散化 定義::把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。

通俗點說就是 在不改變資料的可用性質下縮小其範圍,一般只關注他們的相對大小

但對於本題而言普通離散化不行,我們還要維護乙個性質,那就是是否相鄰,舉個例子就會明白

[1,5] [1,2] [4,5]離散後[1,4] [1,2][3,4]這樣做的答案為2(原因就是二三區間歸為一起,導致覆蓋第一區間),而實際上答案為3

那我們應該在差值大於1的兩個數之間插入乙個數,避免相鄰的歸為乙個區間

所以  離散化兩性質:大小關係和是否相鄰

線段樹:

只需開乙個陣列來標記出現過的顏色即可

1

//#include

2 #include3 #include4 #include

5 #include

6 #include7

#define ll long long

8const

int maxn=1e5+5;9

using

namespace

std;

1011

int a[maxn],b[maxn],c[maxn*2

];12

int lazy[maxn<<2

];13

bool use[maxn<<2

];14

intans;

1516

void pushdown(int

rt)1722}

23void update(int l,int r,int l,int r,int rt,int

add)

2429

int mid=(l+r)>>1;30

pushdown(rt);

31if(l<=mid)

34if(r>mid)37}

38void query(int l,int r ,int l,int r,int

rt)39

45if(l==r)

46int mid=(l+r)>>1;47

if(l<=mid)

50if(r>mid)53}

54int

main()

5568 sort(c+1,c+m+1

);69 m=unique(c+1,c+m+1)-c;

70 m--;

71for(int i=m;i>1;i--)

7276

}77 sort(c+1,c+m+1

);78 m=unique(c+1,c+m+1)-c;

79for(int i=1;i<=k;i++)

84 query(1,m-1,1,m-1,1

);85 cout

87return0;

88 }

view code

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