一塊 h × w 的廣告牌,依序貼上 n 張寬 wi、高 1 的廣告。每張廣告總是貼在最左上角可行位置(即:最上方的行中,最左邊能放下的位置)。若無法放置輸出 -1,否則輸出該廣告所在的行號(1-based)。h, w ≤ 10^5, n ≤ 200000。
w)。wi 的葉節點,更新該葉與祖先節點的最大值。wi,直接輸出 -1。h > n 時,多餘行永遠用不到,直接令 h = n,節省空間與時間。#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 222222;
int tree[MAXN << 2];
int h, w, n;
void push_up(int rt) {
tree[rt] = max(tree[rt<<1], tree[rt<<1|1]);
}
void build(int rt, int l, int r) {
tree[rt] = w;
if (l == r) return;
int mid = (l + r) >> 1;
build(rt<<1, l, mid);
build(rt<<1|1, mid+1, r);
}
int query(int rt, int l, int r, int x) {
if (l == r) {
tree[rt] -= x;
return l;
}
int mid = (l + r) >> 1;
int ans = (tree[rt<<1] >= x) ? query(rt<<1, l, mid, x) : query(rt<<1|1, mid+1, r, x);
push_up(rt);
return ans;
}
int main() {
while (scanf("%d%d%d", &h, &w, &n) == 3) {
if (h > n) h = n; // 關鍵優化
build(1, 1, h);
while (n--) {
int q; scanf("%d", &q);
if (tree[1] < q) puts("-1");
else printf("%d\n", query(1, 1, h, q));
}
}
return 0;
}
push_up 維護祖先資訊。min(h, n) 是常見優化手法。