hdoj1540 線段樹的表示

2022-03-01 01:46:39 字數 1675 閱讀 9942

大牛blog

這題的題解寫給自己看……

總結(瞎扯一點):

之前只會思考,len,sum,然後gg,如果只是sum和len的去用的話,就是在mid的時候會gg。然後這次也是參考大牛的寫法,其實還是蠻簡單的,寫完以後覺得。。。直接搞兩個左邊連續,右邊連續,然後區間最大,直接弄弄就好了,但是具體實現,如果沒有很多的練習,絕對是錯誤百出啊!

先講小東西:

①:建樹,以後再根據自己的瞎瘠薄在挑戰上看了文字自己寫的建樹真是醜爆了,以後還是用好看的寫法寫,,,,

小東西沒有了。

大東西:

①:update,臥槽,看完大牛blog後面自己寫,直接蒙比了///完全就是亂寫帶節奏。。。其實很簡單:一、找乙個能return的條件,return掉;二、如果不能,下來的步驟就是繼續(搜尋)下去,本來就是個遞迴嘛。三、搜尋完以後,你回來的那個節點還沒有處理過,也就是那個節點的我所需要的資訊還沒有處理過。那麼就要考慮各種情況,把這個節點處理的乾乾淨淨,處理的非常奈斯。

二、query,主要還是線段樹的節點資訊處理的好的話,query就非常方便,這也不講了。

ps:這題噁心到的是,特麼還是多組資料,先是打完**,找了半小時錯誤,然後莫名其妙再wa了5,6發,哎,心累。。。講道理,這道題目有說多組資料麼?

再說一下,線段樹對於練習的話,在dev編譯器練習比較不錯,什麼提示都沒有,完全看自己思路。

ok,gg,貼份挫code跑。。。

挫code……………

#include

#include

#include

#include

#include

using namespace std;

typedef long long ll;

const int n=1e4+10;

struct asd;

asd q[n*20];

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

}int query(int num,int t)

else

}void update(int num,int t,int

x) int mid=(q[num].left+q[num].right)/2;

if(mid>=t)

update(2

*num,t,x);

else

update(2

*num+1,t,x);

q[num].ls=q[2*num].ls;

q[num].rs=q[2*num+1].rs;

q[num].ms=max(q[2*num].ms,max(q[2*num+1].ms,q[2*num].rs+q[2*num+1].ls));

if(q[2*num].ls==(q[2*num].right-q[2*num].left+1))

q[num].ls+=q[2*num+1].ls;

if(q[2*num+1].rs==(q[2*num+1].right-q[2*num+1].left+1))

q[num].rs+=q[2*num].rs;

}int re[n*5];

int main()

else

if(strcmp(ss,"d")==0)

else}}

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相連的村莊有多少個。思路 一開始只知道是線段樹,想著肯定得用結構體記錄每個點的資訊,怎麼記錄就不知道了。然後學了線段樹區間合併。...