现在的位置: 首页 > 综合 > 正文

HDU-2795(线段树入门)

2013年04月07日 ⁄ 综合 ⁄ 共 972字 ⁄ 字号 评论关闭

这个说是线段树入门....我其实还是开始的时候没有摸到头脑的.....

开始的想法是用普通方法做的,但是,自己忽略了20W*20W  400亿肯定会超时的....

用其线段树就舒服多了.

线段树不说可以省内存,但是他的有点就是可以优化询问....我把上一次的询问直接给你更新上去,你下次再问,我直接就给你个爽点的答案,这多爽!

贴出线段树的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

struct Node{
	int a;
	int b;
	int max;
}tree[888888];
int height,row,N;

int min(int a,int b)
{
	return a>=b?b:a;
}

int max(int a,int b)
{
	return a>=b?a:b;
}

void pushup(int i)
{
	tree[i].max=max(tree[i<<1].max,tree[i<<1|1].max);
}

void Buildtree(int i,int a,int b)
{
	tree[i].a=a;
	tree[i].b=b;
	tree[i].max=row;
	if(a==b)
	{
		return;
	}
	int mid=(a+b)>>1;
	Buildtree(i<<1,a,mid);
	Buildtree(i<<1|1,mid+1,b);
}

int query(int q,int i)
{
	if(tree[i].a==tree[i].b)
	{
		tree[i].max-=q;
		return tree[i].a;
	}
	int mid=(tree[i].a+tree[i].b)>>1;
	int ans=tree[i<<1].max>=q?query(q,i<<1):query(q,i<<1|1);
	pushup(i);
	return ans;
}


int main()
{
	while(scanf("%d%d%d",&height,&row,&N)!=EOF)
	{
		int n=min(height,N);
		Buildtree(1,1,n);
		for(int i=1;i<=N;i++)
		{
			int q;
			scanf("%d",&q);
			if(q>tree[1].max)
				printf("-1\n");
			else
				printf("%d\n",query(q,1));
		}
	}
	return 0;
}

 

抱歉!评论已关闭.