データ構造線分樹HDU 2795 Billboard(単点更新)
1260 ワード
h**wの広告板があります.今はn回の広告を追加したいです.各広告の幅は全部1で、しかも横に置くしかないです.順次各広告の長さxを入力して、広告がどの行に挿入されているかを聞きます.出力-1は挿入できません.
解法:線分樹、単点更新、残りのところの最大値を返します.udateはそのままqueryで行います.
解法:線分樹、単点更新、残りのところの最大値を返します.udateはそのままqueryで行います.
#include
#include
#include
#include
#include
using namespace std;
const int N=222222;
//
//n , n h
// h , 2X10^5, 10^9
int Max[N<<2];
int h,w,n;
void PushUP(int rt){
Max[rt]=max(Max[rt<<1],Max[rt<<1|1]);
}
void build(int l,int r,int rt){
Max[rt]=w;
if(l==r) return ;
int m=(l+r)>>1;
build(l,m,rt<<1);
build(m+1,r,rt<<1|1);
}
int query(int x,int l,int r,int rt){
//x
if(l==r){
Max[rt]-=x;
return l;//
}
int m=(l + r)>>1;
int ret=0;
// x ,
if(Max[rt<<1]>= x)
ret=query(x,l,m,rt<<1);
else ret=query(x,m+1,r,rt<<1|1);
PushUP(rt);
return ret;
}
int main()
{
while(~scanf("%d%d%d",&h,&w,&n))
{
// n ,h
// n h
if(h>n) h=n;
build(1,h,1);
while(n--)
{
int x;
scanf("%d",&x);
// Max[1]
if(Max[1]