线段树题目,不过不需要开10^9这样大的数组,也开不下,最多开的数组大小也就是200010 << 2这样大的数组就可以了
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <stack>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <set>
#include <vector>
#include <cstring>
#include <algorithm>
#define INF 0x3fffffff
#define N 200010
#define M (N << 2)
#define LL long long
#define mod 95041567
using namespace std;
struct Node{
int set;
int sum;
int l, r;
};
int p[M];
void build(int rt, int l, int r, int val){
p[rt] = val;
if(l == r) return ;
int mid = (r - l) / 2 + l;
int lc = rt << 1;
int rc = lc + 1;
build(lc, l, mid, val);
build(rc, mid + 1, r, val);
}
void update(int rt, int l, int r, int w, int &v){
if(p[rt] < w) return ;
if(l == r){
v = l;
p[rt] -= w;
return ;
}
int mid = (r - l) / 2 + l;
int lc = rt << 1;
int rc = lc + 1;
if(p[lc] >= w) update(lc, l, mid, w, v);
else if(p[rc] >= w) update(rc, mid + 1, r, w, v);
p[rt] = max(p[lc], p[rc]);
}
int main() {
// freopen("in.txt", "r", stdin);
int h, w, n;
while(scanf("%d %d %d", &h, &w, &n) != EOF){
h = min(n, h);
build(1, 1, h, w);
while(n --){
scanf("%d", &w);
int v = -1;
update(1, 1, h, w, v);
printf("%d\n", v);
}
}
return 0;
}
hdu 2795 Billboard
最新推荐文章于 2019-01-12 19:22:30 发布