線段樹 應用 公告牌

2021-08-20 03:13:08 字數 987 閱讀 8633

大致思路:

剛開始一看完題,粗口都要爆出來了,這應該用貪心還是什麼dp來做的吧!

但是定睛一看,資料量著實很大,其實dp是不能handle的。所以,這道題用線段樹來做,才是滿分。

那麼怎麼用線段樹來做呢?要聯絡到線段樹,先想想我的陣列序列要是什麼含義的(每一行已放置的木板寬度?剩餘的木板寬度?(這倆一樣的..)),想想線段樹s陣列來存個區間的啥值(和?最值?)。然後再將題意聯絡到兩個點——單點更新和區間查詢,看看咋個用這倆方法來得到答案。

讀一讀題,覺得陣列序列的含義就是每一行已放置的木板寬度,s陣列就來儲存區間最小值,單點更新就是說某一行要加減更新了,需要更新這個區間最小值嘛,那麼區間查詢我就去查詢它哪一行還能放下我當前這塊木板。但是題意還有個前提——要行數盡量小。這裡給我繞了個腦筋,但是想通了又覺得好簡單,這不就是讓s陣列的下標盡量的小嗎?那不也就是盡量往左孩子裡去找嗎???!!!!!

因此,我們根據這個思路,修改一下區間查詢的函式,如果(公告牌寬度h-左孩子區間的最小值)>=當前木板寬度,則趕緊往左孩子裡去繼續遞迴,否則就只能去右孩子那兒遞迴了。遞迴臨界條件是l==r即找到葉子結點,返回l就是答案。

ac**:

#include#includeusing namespace std;

const int maxn=8e5+5;

int s[maxn];

int renew(int p,int l,int r,int x,int v) //x+v 使用了的寬度增加

int w; //公告板寬度

int getmin(int p,int l,int r,int a) //返回寬度為a的公告牌能放的最小的行數

int main()

else

printf("-1\n");

} return 0;

}

線段樹應用

1 區間最值查詢問題 查詢區間最值下標 min includeusing namespace std define maxn 100 define maxind 256 線段樹節點個數 構建線段樹,目的 得到m陣列.void build int node,int b,int e,int m,int ...

線段樹的應用

標籤 空格分隔 c 資料結構 有時候我們求乙個給定的平面直角座標系中的n個矩形的面積,而此時,我們就需要引入一種高效且奇妙的演算法 掃瞄線。例如該圖 我們將其中的矩形按上下邊,構建4條掃瞄線,並按照y值大小進行排序,並標記為上或下。但是由於矩形的x座標有4個,並且相互關聯,而想要提公升演算法效率就必...

線段樹的基礎應用

大約為葉子節點的4倍 線段樹父節點的資訊可以利用up 從子節點提取的 同時線段樹樹上可以通過down 將父節點的資訊給子節點 void tree int l,int r,int p void build int l,int r,int p 以求區間和為例 void update int x,int ...