POJ2528線段樹區間合併加離散化

2021-10-03 17:53:02 字數 1901 閱讀 2290

poj2528mayor』s posters就只支援一種操作,一次性的給一段區間塗上顏色,且每次顏色均不一樣。問最後一共可以看到多少種顏色。

關於線段樹的更詳細實現請參考線段樹解決區間問題包括延遲操作以及離散化

/*

在數軸上,一次給乙個線段塗上顏色

後面的顏色會覆蓋前面的顏色

問最後能看到多少個顏色

顯然是成段更新,線段樹

區間範圍是1千萬,需要離散化

另外注意位置編號的含義

*/#include

#include

#include

#include

using

namespace std;

intconst size =

20010

;inline

intlson

(int x)

inline

intrson

(int x)

int st[size<<2]

;//段數

int l[size<<2]

,r[size<<2]

;//左右邊界的顏色

int lazy[size<<2]

;struct _t};

inline

void

_pushup

(int t)

inline

void

_pushdown

(int t)

}_t query

(int t,

int s,

int e,

int a,

int b)

_pushdown

(t);

int mid =

(s+e)

>>1;

_t lans,rans;

if( a <= mid )

if( mid < b )

return

_t(lans.cnt+rans.cnt+

(lans.right==rans.left?-1

:0),lans.left,rans.right);}

void

modify

(int t,

int s,

int e,

int a,

int b,

int color)

_pushdown

(t);

//?int mid =

( s + e )

>>1;

if( a <= mid )

modify

(lson

(t),s,mid,a,b,color);if

( mid < b )

modify

(rson

(t),mid+

1,e,a,b,color)

;_pushup

(t);

}int

getunsigned()

int n,nn;

int t[size]

;int a[size]

,b[size]

;bool

read()

int flag[size]

;int

main()

//檢查結果

fill

(flag,flag+n+1,

0);int cnt =0;

for(

int i=

1;i<=nn;

++i)

}printf

("%d\n"

,accumulate

(flag+

1,flag+n+1,

0));

}return0;

}

POJ2528 線段樹的區間操作

首先應該對該 0,10000000 進行離散化 即先將點集進行排序,然後從小到大縮小其中的間距,使得最後點數不會超過2 n 然後就是線段樹操作 只需進行染色,然後最後用nlgn進行乙個個查詢顏色記錄即可 include include int color 20005 4 a 20005 p 2000...

POJ2528 離散化線段樹

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

poj 2528 線段樹 離散化

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