标签:
Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 16023 Accepted Submission(s): 6770
#include<stdio.h> #include<string.h> #include<algorithm> #define MAX 200010 using namespace std; int Max[MAX<<2]; void pushup(int o) { Max[o]=max(Max[o<<1],Max[o<<1|1]); } void gettree(int o,int l,int r,int w) { Max[o]=w;//每个初值都设为行长,然后根据输入的广告的长度相应的缩短 if(l==r) return ; int mid=(l+r)>>1; gettree(o<<1,l,mid,w); gettree(o<<1|1,mid+1,r,w); pushup(o);//维护区间最大值 } int find(int o,int l,int r,int v) { if(l==r) { Max[o]-=v; return l;//如果本行可以放下这个长度的广告 就输出当前所在的行数l } //因为如果第一行不可以,下边的回溯会改变l的值 int mid=(l+r)>>1; int ans; if(Max[o<<1]>=v) ans=find(o<<1,l,mid,v); else ans=find(o<<1|1,mid+1,r,v); pushup(o); return ans; } int main() { int h,n,i,j,a,w; while(scanf("%d%d%d",&h,&w,&n)!=EOF) { int x=min(h,n);//建树时行数应当是刚好 gettree(1,1,x,w); while(n--) { scanf("%d",&a); if(Max[1]<a)//Max[1]表示整棵树上的最大值 printf("-1\n"); else printf("%d\n",find(1,1,x,a)); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/tonghao/p/4808875.html