diff --git a/HDOJ/2795_libin56842.cpp b/HDOJ/2795_libin56842.cpp new file mode 100644 index 0000000..b5107ea --- /dev/null +++ b/HDOJ/2795_libin56842.cpp @@ -0,0 +1,62 @@ +#include +#include +#include +using namespace std; + +int h,w,n; +int ans; + +struct node +{ + int l,r,n; +} a[1000000]; + +void init(int l,int r,int i,int w)//建树 +{ + a[i].l=l; + a[i].r=r; + a[i].n=w; + if(l!=r) + { + int mid=(l+r)/2; + init(l,mid,2*i,w); + init(mid+1,r,2*i+1,w); + } +} + +void insert(int i,int x) +{ + if(a[i].l == a[i].r)//到了叶子节点,叶子节点的值既是层数 + { + a[i].n-=x;//该层宽度减少 + ans = a[i].l; + return ; + } + if(x<=a[2*i].n)//符合要求搜左子树 + insert(2*i,x); + else//否则右子树 + insert(2*i+1,x); + a[i].n = max(a[2*i].n,a[2*i+1].n);//将左右子树里能放的最大长度存入父亲节点,进行更新 +} + +int main() +{ + int i,k; + while(~scanf("%d%d%d",&h,&w,&n)) + { + if(h>n)//根据题意,因为最多放n个公告,占用的最大高度也只有n,如果根据h的大小建树,由于h太大,这个树根本就建不起来,所以在这里就优化建树的高度 + h = n; + init(1,h,1,w); + ans = -1; + for(i = 1; i<=n; i++) + { + scanf("%d",&k); + if(a[1].n>=k)//如果这个公告没有超出公告板的长度,那么才能放入 + insert(1,k); + printf("%d\n",ans); + ans = -1; + } + } + + return 0; +}