您的位置:首页 > 其它

HDU 2795 线段树 水题

2013-09-05 18:29 363 查看
水题

从左至右找到位置就插入即可

#include "stdio.h"

#include "string.h"

#include "math.h"

#include "stdlib.h"

#include "algorithm"

#include "iostream"

using namespace std;

int w;

struct comp

{

int l,r,mid,max;

} data[600010];

int max(int a,int b)

{

if (a<b) return b;

else return a;

}

void build(int l,int r,int k)

{

data[k].l=l;

data[k].r=r;

data[k].mid=(l+r)/2;

data[k].max=w;

if (l==r) return ;

build(l,data[k].mid,k*2);

build(data[k].mid+1,r,k*2+1);

}

void search(int x,int k)

{

if (data[k].l==data[k].r)

{

printf("%d\n",data[k].l);

data[k].max-=x;

return ;

}

if (data[k*2].max>=x) search(x,k*2);

else

search(x,k*2+1);

data[k].max=max(data[k*2].max,data[k*2+1].max);

}

int main()

{

int h,n,x,m;

while (scanf("%d%d%d",&h,&w,&n)!=EOF)

{

if (h<n) m=h; else m=n; // 缩小树的范围

build(1,m,1);

while (n--)

{

scanf("%d",&x);

if (data[1].max<x) printf("-1\n");

else search(x,1);

}

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: