hdu 1540 線段樹 最大連續區間

2021-06-29 10:06:11 字數 1220 閱讀 8951

/*

在區間中,有三種操作,

q x 查詢包含x的最長連續區間

d x 將x點毀掉即x點左右不再連續

r 修復上一次毀壞的點

思路:記錄每個區間的左右端的連續區間長度,

x若在左端點連續區間,則該區間只可能是其父親的右孩子,

因為如果是左孩子,則訪問其父區間的時候,父區間的左連續區間便已包含x。

所以直接將該右孩子區間的左連續區間加上其兄弟區間的右連續區間即是最終結果。

毀壞的點按順序儲存棧裡,注意!可能同乙個點毀壞多次,但仍需入站!棧空無需修復。

*/#include #includeusing namespace std;

#define n 50010

struct node

tree[n*4];

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

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

build(l,mid,root*2);

build(mid+1,r,root*2+1);

}int query(int x,int root)

if(tree[root].rn)

}if(tree[root].ln)

if(tree[root].rn)

if(tree[root].l==tree[root].r) return 0;

int mid=(tree[root].l+tree[root].r)>>1;

if(mid>=x) return query(x,root*2);

else return query(x,root*2+1);

}void update(int x,int root,int b)//b=0為毀壞操作,1修復

int mid=(tree[root].l+tree[root].r)>>1;

if(mid>=x) update(x,root*2,b);

else update(x,root*2+1,b);

if(tree[root*2].ln+tree[root*2+1].rn==tree[root].len)

tree[root].ln=tree[root].rn=tree[root].len;

else

}int main()

else if(c=='q')

else}}

return 0;

}

HDU 1540 線段樹 區間合併 最大連續區間)

做kuangbin線段樹專題的時候遇到的題目,感覺這是一道非常有趣的題目。線段樹的題目做的比較少,沒有見過這種通過線段樹在區間上做文章的題目,感覺做完這個題目之後加深了對線段樹左右孩子所覆蓋的區間之間的關係的認識。題意 1 n個地道,m個次操作,d代表摧毀第i個地道,q代表查詢包含第i個地道的最大連...

hdu1540(線段樹求連續區間最大和)

題意 最初1 2 3 n按照順序每個點與相鄰的和兩點相連成一條鏈。三種操作d 毀掉x r 恢復上次毀掉的 q 查詢與x直接相連或者間接相鄰的數量 包括自己 題目型別 線段樹求區間連續最大和的模板題目 思路 維護區間從左端點開始最大連續個數lsum,以及當前區間從右端點開始最大連續的個數rsum。重點...

hdu1540(線段樹維護連續區間模型)

translation 打地道戰,n個村莊用地道連成一條直線,鬼子有時破壞掉乙個村莊,這時八路軍要修好這個據點。現在要求詢問任意乙個村莊,得出這個村莊現在與幾個村莊相連,包括它本身。solution 線段樹維護連續子區間 將村莊抽象成乙個點,正常下值為1,被破壞後變成0,即可將題目抽象成乙個求目標節...