hdu 2795
這題有點特殊, 要在查詢的時候更新, 而且 因為是找最小的行數, 所以非左即右,優先考慮左(存在解情況下)
ac code:
#include #include #include #include #includeusing namespace std;
#define debug 0
#define inf 0x3f3f3f3f
#define mid ((l + r) >> 1)
#define ls rt << 1, l, mid
#define rs rt << 1 | 1, mid + 1, r
const int maxn = 200000 + 5;
int len[maxn << 2], h, w, n; //線段樹陣列儲存, 左右孩子的最小的行寬
void pushup(int rt)
void build(int rt, int l, int r)
build(ls);
build(rs);
pushup(rt);
}int query(int temp, int rt, int l, int r)
int res;
res = len[rt << 1] + temp <= w ? query(temp, ls) : query(temp, rs);//有解, 非左即右, 優先左
pushup(rt); //查詢時更新。
return res;
}int main()
else
} }return 0;
}
hdu 2795 單點更新
題意 有乙個公告欄,h m的,給定n個操作,對於每乙個操作給定乙個數wi,表示有乙個通知的大小是1 wi的,每次對於這種操作將這個通知放在盡可能上面盡可能左邊的位置中去。思路 有h行,將每一行初始為m,表示還有m個空位可以放,那麼運用一棵線段樹來記錄下,行之間的區間最大值,就是可以放下的最大值。對於...
hdu 2795 找區間最值的位置
題目很好理解 我只寫了兩種一種是update和query合併的線段樹是參考的。還有是分開的最開始寫的 本來想寫樹狀陣列的但是一下子真沒想到區間最值的更新位置怎麼弄就先緩緩吧。希望有大牛可以指點 include include using namespace std define lson l m r...
hdu 2795 單點改動
題意 有h w大的公告板。有n條公告要寫入,每條公告高度都是1,寬度是wi,每次從最上最左的空位寫,假設有空位輸出第幾行。假設沒有足夠空位輸出 1。題解 注意h最大1e9。但事實上是看n的大小。由於假設有n條公告最多佔n行,所以線段樹最大是min h,n include include includ...