poj 2528 線段樹 離散化 有顏色的區間覆蓋

2021-07-04 07:02:59 字數 1014 閱讀 9839

區間覆蓋,和一般的區間覆蓋問題的區別是每個覆蓋的區間是有顏色的,最後要輸出可見的顏色個數。對於每個區間操作,我們可以採用懶標記的思想,等到有其他區間覆蓋過來時,將該區間的顏色向下傳遞。具體見**。

#include #include #include using namespace std;

struct node

;node a[10002];

int n,m,q;

int lisan[20002],f[80002];

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

void push(int k)

}void change(int l,int r,int k,int l,int r,int val)

push(k); //將顏色向下傳遞

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

if (r<=mid) change(l,mid,2*k,l,r,val);

else if (l>mid) change(mid+1,r,2*k+1,l,r,val);

else

if ((f[2*k]==-1)||(f[2*k+1]==-1)) f[k]=-1; //f[k]=-1表示該區間有多種顏色

else if (f[2*k]==-2) f[k]=f[2*k+1];

else if (f[2*k+1]==-2) f[k]=f[2*k];

else if (f[2*k]==f[2*k+1]) f[k]=f[2*k];

else f[k]=-1;

}bool work(int l,int r,int k,int l,int r,int val)

}int main()

{ int t;

scanf("%d",&t);

while (t--)

{q=0;

scanf("%d",&n);

m=0;

for (int i=0;i

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