题意:
给出一个h*w的版面,现在要将每个海报(1*wi)贴到这上面,每次要选择最左边能够贴的地方!
题解:
其实n个点最多能用的高度就是n,那么可以根据搞当区间进行线段树,好吧我还是太水了。
#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define B(x) (1<<(x))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
void cmax(int& a, int b){ if (b>a)a = b; }
void cmin(int& a, int b){ if (b<a)a = b; }
void cmax(ll& a, ll b){ if (b>a)a = b; }
void cmin(ll& a, ll b){ if (b<a)a = b; }
void add(int& a, int b, int mod){ a = (a + b) % mod; }
void add(ll& a, ll b, ll mod){ a = (a + b) % mod; }
#define lson rt<<1
#define rson rt<<1|1
const int oo = 0x3f3f3f3f;
const ll OO = 0x3f3f3f3f3f3f3f3f;
const ll MOD = 1000000007;
const double eps = 1e-9;
const int maxn = 210000;
struct SegTree{
int l, r, len;
int mid(){ return (l + r) >> 1; }
}tree[maxn << 2];
void push_up(int rt){
tree[rt].len = max(tree[lson].len, tree[rson].len);
}
void build(int l, int r, int rt, int w){
tree[rt].l = l;
tree[rt].r = r;
tree[rt].len = w;
if (l == r) return;
int mid = (l + r) >> 1;
build(l, mid, lson, w);
build(mid + 1, r, rson, w);
}
int query(int len, int rt){
if (tree[rt].l == tree[rt].r){
tree[rt].len -= len;
return tree[rt].l;
}
int res = 0;
if (len <= tree[lson].len)
res = query(len, lson);
else if (len <= tree[rson].len)
res = query(len, rson);
push_up(rt);
return res;
}
int main(){
//freopen("E:\\read.txt","r",stdin);
int h, w, n;
while (scanf("%d %d %d", &h, &w, &n) > 0){
build(1, min(h, n), 1, w);
for (int i = 1; i <= n; i++){
scanf("%d", &w);
if (tree[1].len >= w)
printf("%d\n", query(w, 1));
else
printf("-1\n");
}
}
return 0;
}