POJ 2528(線段樹 離散化)詳解

2021-09-21 17:23:50 字數 2123 閱讀 2140

//#if 0

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define ull unsigned long long

#define cls(x) memset(x,0,sizeof(x))

#define clslow(x) memset(x,-1,sizeof(x))

#define inf 0x3f3f3f3f

//typedef long long ll;

using namespace std;

const

int maxn=

2e4+

100;

const

int mod=

1e9+7;

//a是存離散化數字的陣列,就是存海報左右區間**現過的數字,tot就是通用的存a個數的變數

//lazy就是通用的懶惰標記陣列

//vis就是最後求取總區間內出現過多少不同數字時防止重複計算的標記

//count就是答案

//這裡要注意maxn,給一萬個詢問,就是會出現兩萬個數字,a最壞存4萬個,lazy一般是a的4倍,vis只要兩萬

int a[maxn<<1]

,lazy[maxn<<3]

,tot=

1,vis[maxn]

,count=0;

struct nn

p[maxn]

;//下推標記陣列,以-1為空標記

void

push_down

(int rt)

}void

update

(int l,

int r,

int l,

int r,

int rt,

int c)

int mid=

(r+l)

>>1;

push_down

(rt);if

(l<=mid)

update

(l,r,l,mid,rt<<

1,c);if

(r>mid)

update

(l,r,mid+

1,r,rt<<1|

1,c);}

void

query

(int l,

int r,

int l,

int r,

int rt)

if(l==r)

return

;//詢問裡面要千萬注意這裡,一定要寫,不然re,當l==r說明查詢到結尾卻沒有碰到

//lazy不是-1的,說明這是兩個海報之間的空隙部分,不寫就一直死迴圈

int mid=

(l+r)

>>1;

// push_down(rt);

if(l<=mid)

query

(l,r,l,mid,rt<<1)

;if(r>mid)

query

(l,r,mid+

1,r,rt<<1|

1);}

intmain()

sort

(a+1

,a+tot)

; tot=

unique

(a+1

,a+tot)

-a;//防止有重複資料干擾

int k=tot;

for(

int i=

2;i)sort

(a+1

,a+tot)

;for

(int i=

1;i<=n;i++

)// cout,tot-1,

1,tot-1,

1); cout<}return0;

}

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