poj2528 線段樹離散染色)

2021-06-26 14:09:15 字數 1013 閱讀 8660

思路:l,r範圍很大,需要離散化,離散化時注意排序後如果相鄰兩個數字則可以賦相鄰的值,如果二者之間差大於一這需要賦值相差2,例如1-10為紅色,1-2為綠色,9-10為藍色,正確答案為3.

#include#include#includeusing namespace std;

const int n=10005;

int t[n*2],vis[n],tp[n*4],ans,cnt,n;

struct tt

sd[n];

struct node

d[40010<<2];

int find(int x)

}void pushdown(int rt)

void pushup(int rt)

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

void updata(int rt,int l,int r,int a)

if(d[rt].al)

pushdown(rt);

int mid=(d[rt].l+d[rt].r)>>1;

if(r<=mid)

updata(rt<<1,l,r,a);

else if(l>mid)

updata(rt<<1|1,l,r,a);

else

if(d[rt<<1].c==d[rt<<1|1].c&&d[rt<<1].al==1&&d[rt<<1|1].al==1)

pushup(rt);

}void query(int rt,int l,int r)

return ;

}pushdown(rt);

}int mid=(d[rt].l+d[rt].r)>>1;

if(r<=mid)

query(rt<<1,l,r);

else if(l>mid)

query(rt<<1|1,l,r);

else

}int main()

build(1,1,cnt-1);

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