Billboard

Time Limit : 20000/8000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 12   Accepted Submission(s) : 6
Problem Description
At the entrance to the university, there is a huge rectangular billboard of size h*w (h is its height and w is its width). The board is the place where all possible announcements are posted: nearest programming competitions, changes in the dining room menu, and other important information.
On September 1, the billboard was empty. One by one, the announcements started being put on the billboard.
Each announcement is a stripe of paper of unit height. More specifically, the i-th announcement is a rectangle of size 1 * wi.
When someone puts a new announcement on the billboard, she would always choose the topmost possible position for the announcement. Among all possible topmost positions she would always choose the leftmost one.
If there is no valid location for a new announcement, it is not put on the billboard (that's why some programming contests have no participants from this university).
Given the sizes of the billboard and the announcements, your task is to find the numbers of rows in which the announcements are placed.
 
Input
There are multiple cases (no more than 40 cases).
The first line of the input file contains three integer numbers, h, w, and n (1 <= h,w <= 10^9; 1 <= n <= 200,000) - the dimensions of the billboard and the number of announcements.
Each of the next n lines contains an integer number wi (1 <= wi <= 10^9) - the width of i-th announcement.
 
Output
For each announcement (in the order they are given in the input file) output one number - the number of the row in which this announcement is placed. Rows are numbered from 1 to h, starting with the top row. If an announcement can't be put on the billboard, output "-1" for this announcement.
 
Sample Input
3 5 5
2
4
3
3
3
 
Sample Output
1
2
1
3
-1

#include<stdio.h>
#include<string.h>
#define maxn 500004
int w;
struct node
{
int left,right;
int max;
};
node tree[*maxn];
int mmax(int a,int b)
{
return a>b?a:b;
}
void build(int left,int right,int i)
{
tree[i].left =left;
tree[i].right =right;
tree[i].max=w;
if(tree[i].left ==tree[i].right )
return ;
build(left,(left+right)/,*i);
build((left+right)/+,right,*i+);
}
int find(int k,int limit)
{
int t;
if(tree[k].max<limit) return -;
if(tree[k].left==tree[k].right)
{
tree[k].max-=limit;
return tree[k].left;
} t=find(*k,limit);
if(t==-) t=find(*k+,limit);
if(t!=-) tree[k].max=mmax(tree[*k].max,tree[*k+].max);
return t;
}
int main()
{
int h,n,i,f,row;
while(~scanf("%d%d%d",&h,&w,&n))
{
if(h>) h=;//n最多只能取到200000.这样不加就wa。
build(,h,);
for(i=;i<n;i++)
{
scanf("%d",&f);
row=find(,f);
printf("%d\n",row);
}
}
return ;
}

最新文章

  1. Mysql示例数据库employees.sql导入问题
  2. Part 56 Generics in C#
  3. 10.30 afternoon
  4. CommandBehavior.CloseConnection的使用
  5. 将已有的工程项目添加到Xcode到Git管理中
  6. 杂谈3之English
  7. 什么东西那么吸引别人的眼球!! -----------------------------------for循环
  8. IdentityServer4 指定角色授权(Authorize(Roles=&quot;admin&quot;))
  9. AutoMapper IIS回收引发的 未将对象引用设置到对象实例
  10. java多线程编程核心技术——全书总结
  11. JavaScript基础知识(数据类型及转换、运算符)
  12. #pta循环作业
  13. Linux下的硬链接与软链接
  14. setInterval setTimeout 详解
  15. tensorflow-用DASC结合Inception-v3对imagenet2012聚类实现
  16. js filter 数组去重
  17. Angular7.1.4+Typescript3.1框架学习(一)
  18. Struts2框架的概述及学习重点
  19. 【本周主题】第三期 - JavaScript 内存机制
  20. 转:GET和POST两种基本请求方法的区别

热门文章

  1. IOS高级开发 runtime(一)
  2. java PropertyChangeSupport委托帧听类的使用
  3. 安装&quot;MySQLdb&quot;一波三折.
  4. bzoj2732: [HNOI2012]射箭 半平面交
  5. MVC的发展
  6. 网站开发常用jQuery插件总结(八)标签编辑插件Tagit
  7. @using (Html.BeginForm())收集
  8. [CLR VIA C#] chapter2 building,packaging,deploying, and administering
  9. NOIP2015 普及组(Junior) 解题报告
  10. Quartz1.8.5例子(十四)