hdu 2795 线段树之五

来源:互联网 发布:剑灵李小龙捏脸数据 编辑:程序博客网 时间:2024/05/20 10:51

将h与n的最小值用来作为建树的空间;

View Code

Problem : 2795 ( Billboard )     Judge Status : Accepted
RunId : 11310448    Language : G++    Author : lihaozhuzhuxia
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
#include <cstdio>#include <iostream>#include <cstring>using namespace std;struct p{    int l;    int r;    int w;    int id;}tree[888888];int h,w;void build(int l,int r,int n){    tree[n].l=l;    tree[n].r=r;    tree[n].w=w;    if(tree[n].l==tree[n].r)    {         tree[n].id=l;         return;    }    int mid=(tree[n].l+tree[n].r)/2;    build(l,mid,n*2);    build(mid+1,r,n*2+1);}void change(int l,int r,int n,int k){    int mid=(tree[n].l+tree[n].r)/2;    if(tree[n].l==tree[n].r)    {        tree[n].w+=k;        return;    }    else if(r<=mid)    {        change(l,r,n*2,k);    }    else if(l>mid)    {        change(l,r,n*2+1,k);    }    tree[n].w=max(tree[n*2+1].w,tree[n*2].w);}int query(int l,int r,int n,int k){    int mid=(tree[n].l+tree[n].r)/2;    if(tree[n].w<k)    return -1;    if(tree[n].l==tree[n].r)    return tree[n].id;    if(tree[n*2].w>=k)    return query(l,mid,n*2,k);    else if(tree[n*2+1].w>=k)    return  query(mid+1,r,n*2+1,k);}int main(){    int i,j,k,l,n,m,t;    while(scanf("%d%d%d",&h,&w,&n)==3)    {        t=h;        if(t>n)        t=n;        build(1,t,1);        for(i=0;i<n;i++)        {            scanf("%d",&k);            m=query(1,t,1,k);            printf("%d\n",m);            //cout<<tree[4].w;            if(m!=-1)            change(m,m,1,-k);        }    }    return 0;}

0 0