hdu 2795
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795
题意:给出广告牌的宽和高,接下来有n个广告,每个广告要求尽量往上往左放。问该广告牌放在哪一行。
用线段树维护最大值。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define lson l,mid,now<<1 #define rson mid+1,r,now<<1|1 const int maxn=200010; int flag; int t[maxn*4]; void build(int l,int r,int now,int w) { t[now]=w; if(l==r) return ; int mid=(l+r)>>1; build(lson,w); build(rson,w); } void add(int l,int r,int now,int x) { if(flag||t[now]<x) return ; if(l==r){ if(t[now]>=x){ t[now]-=x; flag=1; printf("%d\n",l); } return ; } int mid=(l+r)>>1; if(t[now<<1]>=x) add(lson,x); else if(t[now<<1|1]>=x) add(rson,x); t[now]=t[now<<1]>t[now<<1|1]?t[now<<1]:t[now<<1|1]; } int main() { int h,w,n; while( ~scanf("%d%d%d",&h,&w,&n)){ int x; if(h>n) h=n; build(1,h,1,w); while(n--){ scanf("%d",&x); flag=0; add( 1, h, 1, x); if(!flag) printf("-1\n"); } } return 0; }