解題思路:這一題要求的是連續區間,所以可以把它的子區間合併,這裡運用線段樹,但是在儲存節點資訊的方面要做一點修改
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相連的村莊有多少個。思路 一開始只知道是線段樹,想著肯定得用結構體記錄每個點的資訊,怎麼記錄就不知道了。然後學了線段樹區間合併。...