http://acm.hdu.edu.cn/showproblem.php?pid=2795
题意:有一个h*w的布告板,每次粘贴1*wi的公告,按照 先考虑最上方,后最左边 的方式粘贴,求该公告贴到了第几行
分析:查找单点
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int NM=200005;
int w,T[NM*4];
void Build(int lf,int rg,int root)
{
T[root]=w; //
if(lf==rg) return;
int mid=(lf+rg)>>1;
Build(lf,mid,root<<1);
Build(mid+1,rg,root<<1|1);
}
int Update(int lf,int rg,int root,int wi)
{
if(lf==rg) {
T[root]-=wi;
return lf;
}
int mid=(lf+rg)>>1;
int res=0;
if(T[root<<1]>=wi) res=Update(lf,mid,root<<1,wi);
else res=Update(mid+1,rg,root<<1|1,wi);
T[root]=T[root<<1]>T[root<<1|1]?T[root<<1]:T[root<<1|1];
return res;
}
int main()
{
int h,n,i,t;
while(scanf("%d%d%d",&h,&w,&n)!=EOF)
{
if(h>n) h=n; //最多可粘贴n行
Build(1,h,1);
for(i=0;i<n;i++)
{
scanf("%d",&t);
if(T[1]<t) {
printf("-1\n");
continue;
}
printf("%d\n",Update(1,h,1,t));
}
}
return 0;
}