zoj zju 3324 線段樹 離散化

2022-05-24 10:39:10 字數 1985 閱讀 9357

當線段樹除錯不出來的時候,請畫一棵樹,設個斷點,照著你的樹走,走完你就ac了

和poj 2528的離散化方法如出一轍,如果兩個相鄰數的大小大於1 ,在中間插入乙個任意的數

線段樹更新的過程類似於求周長並,需要判斷左右邊界是否是一樣的高度(左兒子的右邊界與右兒子的左邊界)

我是左閉右閉的線段樹,所以開始的時候要把n-1加進來(這裡錯了好幾次,一直加了n) ,另外0也要加進來。

舉個例子:區間長度為10 現在總共記錄了1 3 5 7

所以要先把0 9 加進來

離散化後是0 1 2 3 4 5 6 7 8 9

下面這個函式其實是把兩個功能結合在一起了

view code

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

if(l==r)

lbd[rt]=lbd[ll];

rbd[rt]=rbd[rr];

sum[rt]=sum[ll]+sum[rr]-(!rbd[ll]&&!lbd[rr]);

}

線段樹的四個域:

col[maxn<<2]:當前區間被覆蓋次數

sum[maxn<<2]:管轄區間內總的在原位(沒有被下壓)連續區間的段數

int lbd[maxn<<2]:左邊界的高度

rbd[maxn<<2]:右邊界的高度,初始時為0;

view code

#include

#include

#include

using

namespace std;

#define ll rt<<1

#define rr rt<<1|1

#define lson l,m,ll

#define rson m+1,r,rr

const

int maxn = 44444;

int col[maxn<<2],sum[maxn<<2];

int lbd[maxn<<2],rbd[maxn<<2];

struct nodeq[22222];

int x[maxn];

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

if(l==r)

lbd[rt]=lbd[ll];

rbd[rt]=rbd[rr];

sum[rt]=sum[ll]+sum[rr]-(!rbd[ll]&&!lbd[rr]);

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

void update(int l,int r,int c,int l,int r,int rt)

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

if(l<=m) update(l,r,c,lson);

if(r>m) update(l,r,c,rson);

if(col[rt]) return;

pushup(rt,l,r);

}int main()

x[cnt++]=0;x[cnt++]=num-1;

sort(x,x+cnt);

int m=1;

for(i=1;iif(x[i]!=x[i-1]) x[m++]=x[i];

for(i=m-1;i>=1;i--) if(x[i]!=x[i-1]+1) x[m++]=x[i-1]+1;

sort(x,x+m);

build(0,m-1,1);

printf("

case #%d:\n

",ca++);

for(i=0;iint l=lower_bound(x,x+m,q[i].l)-x;

int r=lower_bound(x,x+m,q[i].r)-x;

int c=q[i].op[0]=='

p'?1:-1;

update(l,r,c,0,m-1,1);

printf("

%d\n

",sum[1]);}}

return

0;}

離散化 線段樹

題目 分析 每次1操作會往序列底加first個second,first 和 second 都是最大1e9的資料,每次2操作詢問序列中第first到第second個數的和 一開始就感覺有點像線段樹,輸入資料太大我們可以離線處理把資料離散化下,然後扔到線段樹上,維護兩個陣列 sum 區間數的值的和 nu...

資料離散化 線段樹

前言 遇到了乙個矩形面積堆疊的問題,想了很久。終於找到了方法。先做個小記,待到具體問題時再分析。資料離散化 高大上的名字,其實就是對資料的一種處理,也可以採取陣列 或者 容器 map vector。之類的來儲存。之前的ibm技術俱樂部主席競選 那道題其實就是很好的應用。有些資料本身很大,自身無法作為...

紙帶 線段樹 離散化

題目大意 每次給一段區間染色,求最後整個區間有多少種顏色 分析 用膝蓋想也知道這題線段樹可以輕鬆水過,於是出題人靈機一動,挖了個深坑,每次給的區間是左開右閉的,但題目沒說,他給了你一張圖,你們可以感受一下 於是正解wa成0分我也是很絕望的。有一點要注意一下,離散化後有些區間會並在一起,原來中間的顏色...