HDU2795 线段树 单点更新 区间最大值
2017-08-09 17:30
471 查看
题意:有h*w的告示板, 每张通知的规格为1*wi, 通知张贴的位置优先选最上端的位置, 其次选最左的位置, 求每张通知张贴在第几行?
思路:记录每一行所剩长度, 运用线段树维护区间最大值。左子树值大于wi, 则查询左子树, 否则查询右子树。
反思:
1. 思维不够缜密: 刚开始的想法和正解是相同的, 但考虑到h的范围为1e9, 继而否定了自己的想法。 然而忽略了(所需要用到的)h <= n这一个隐藏条件。
2. 未解之谜:将33行注释掉, 而改成现在版本, 就AC了, 没想清楚原因。
思路:记录每一行所剩长度, 运用线段树维护区间最大值。左子树值大于wi, 则查询左子树, 否则查询右子树。
反思:
1. 思维不够缜密: 刚开始的想法和正解是相同的, 但考虑到h的范围为1e9, 继而否定了自己的想法。 然而忽略了(所需要用到的)h <= n这一个隐藏条件。
2. 未解之谜:将33行注释掉, 而改成现在版本, 就AC了, 没想清楚原因。
#include <iostream> #include <algorithm> #include <cstdio> using namespace std; const int MAXN = 200000+10; int ma[MAXN << 2]; int h, w, n; void PushUp(int rt) { ma[rt] = max(ma[rt << 1], ma[rt << 1 | 1]); return; } void Build(int l, int r, int rt) { if(l == r) { ma[rt] = w; return; } int m = (l + r) >> 1; Build(l, m, rt << 1); Build(m + 1, r, rt << 1 | 1); PushUp(rt); return; } int Query(int w, int l, int r, int rt) { if(l == r) { return l; } int m = (l + r) >> 1; //if(ma[rt] < w) return -1; if(ma[rt << 1] >= w) Query(w, l, m, rt << 1); else Query(w, m + 1, r, rt << 1 | 1); } void Update(int L, int w, int l, int r, int rt) { if(l == r) { ma[rt] -= w; return; } int m = (l + r) >> 1; if(L <= m) Update(L, w, l, m, rt << 1); else Update(L, w, m + 1, r, rt << 1 | 1); PushUp(rt); return; } int main() { while(~scanf("%d%d%d", &h, &w, &n)) { h = min(h, n); Build(1, h, 1); int ww; for(int i = 0; i < n; i++) { cin >> ww; if(ma[1] < ww) {printf("-1\n"); continue;} int ans = Query(ww, 1, h, 1); Update(ans, ww, 1, h, 1); printf("%d\n", ans); } } return 0; }
相关文章推荐
- HDU 2795 线段树区间最大值,单点更新+二分
- HDU 2795 Billboard (线段树 单点更新 区间求最大值)
- 线段树 单点更新查询 区间最大值 hdu 2795 Billboard
- hdu 1754 线段树区间最大值 单点更新
- hdoj 2795 Billboard 【线段树 单点更新 + 维护区间最大值】
- hdu 1754 线段树区间最大值 单点更新
- HDU 2795 Billboard(线段树区间最值查询和单点更新)
- hdu 1754 线段树区间最大值 单点更新
- hdu 1754 线段树区间最大值 单点更新
- HDU 1754 I Hate It(线段树:单点更新,求区间最大值)
- hdu 1754 线段树区间最大值 单点更新
- hdu 2795 Billboard【线段树,区间求最大值,点更新在区间操作中进行】
- hdu 1754 线段树区间最大值 单点更新
- hdu 1754 I Hate It(线段树单点更新求区间最大值)
- 【线段树-单点更新区间最大值】hdu 1754 - I Hate It
- hdu 1754 线段树区间最大值 单点更新
- hdu 2795 Billboard(线段树之 单点更新+区间最值)
- hdu 1754 线段树区间最大值 单点更新
- HDU 2795 线段树(单点更新 区间查询)
- HDU 1754 B I Hate It 线段树 单点更新 区间最大值 模板