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