hdu 1540(線段樹單點更新 區間合併)

2021-07-10 13:25:21 字數 1033 閱讀 3577

解題思路:這一題要求的是連續區間,所以可以把它的子區間合併,這裡運用線段樹,但是在儲存節點資訊的方面要做一點修改

lsum:從這個區間的左端點往右能夠找到的最大連續區間;

rsum:從這個區間的右端點往左能夠找到的最大連續區間;

msum:表示這整個區間能夠找到的最大連續區間;

sum:0表示這個區間還沒有被破壞的點,大於0表示這個區間已經有被破壞的點。

接下來過程就是從大的區間逐漸分解小區間,然後逼近要求的點。。

這道題我一開始只記錄了整個區間能夠找到的最大連續區間,但這樣就會有乙個問題了,因為把[l,r]區間分解為[l,mid],[mid+1,r]區間,很有可能這個mid在最大連續區間裡,這樣就理所當然的要記錄lsum和rsum了。

#include#include#includeusing namespace std;

const int maxn = 50000;

struct segment

tree[maxn<<2];

void pushup(int rt)

else }

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

void insert(int rt,int t,int val)

else

return;

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

if(t <= mid) insert(rt<<1,t,val);

else insert(rt<<1|1,t,val);

pushup(rt);

}int query(int rt,int t)

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

if(t <= mid)

else }

int main()

else if(ch == 'q')

else if(ch == 'r')

}} return 0;

}

線段樹 區間合併 HDU 1540

題意 題意 d 破壞村莊,r 修復最後乙個破損的村莊,q 查詢x在內的連續區間值有多少 思路 建立線段樹,維護左右區間值。注意維護變數為 從左編開始最大連續值,從右邊開始最大值,最大連續值 為了維護最後乙個被破壞的。需要時刻記錄,並且不能只單純記錄乙個,而是需要記錄順序。滿足先入後出的棧操作,傳參即...

HDU 1540 線段樹(區間查詢)

有n個點,每兩個點之間存在一條通路,d x代表摧毀x點,r代表修復最近摧毀的乙個點。q x代表查詢x點能連線多少個村莊 包括自己 比較複雜的線段樹。狀態需要用結構體儲存。l,r代表左邊界和右邊界,ls代表左連續區間長度,rs代表右連續區間長度。ms代表區間內最大連續長度。初始化過程都初始化成1就可以...

線段樹(區間合併)HDU 1540

題意 輸入n,m,給定n個相互連通的村莊,有m個操作,d x,表示破壞x村莊使其與相鄰的兩個村莊不相通,r 表示修復上乙個被破壞的村莊,與相鄰的兩個村莊聯通。q x表示與x相連的村莊有多少個。思路 一開始只知道是線段樹,想著肯定得用結構體記錄每個點的資訊,怎麼記錄就不知道了。然後學了線段樹區間合併。...