HDU1823 Luck and Love

裸裸的二维线段树,二维线段树的入门题,写的树套树,以前觉得很难,现在发现不是那么难了。。。

强转注意精度问题,程序最后有组数据,应该输出-1。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ls (k<<1)
#define rs (k<<1|1)
using namespace std;
const int MAXN=1010;
struct Sub_Tree
{
	int l,r;
	int val;
	int mid()
	{
		return (l+r)>>1;
	}
};
struct Tree
{
	int l,r;
	int mid()
	{
		return (l+r)>>1;
	}
	Sub_Tree subtree[MAXN<<2];
}tree[410];
void pushup(int k,int fa)
{
	tree[fa].subtree[k].val=max(tree[fa].subtree[ls].val,tree[fa].subtree[rs].val);
	//printf("val: ls=%d rs=%d k=%d\n",tree[fa].subtree[ls].val,tree[fa].subtree[rs].val,tree[fa].subtree[k].val);
	//printf("l-r: ls=%d  rs=%d k=%d\n",tree[fa].subtree[ls].l,tree[fa].subtree[rs].l,tree[fa].subtree[k].l);
}
void build_sub(int l,int r,int k,int fa)
{
	tree[fa].subtree[k].l=l;
	tree[fa].subtree[k].r=r;
	tree[fa].subtree[k].val=-1;
	if(l==r)
		return;
	int mid=tree[fa].subtree[k].mid();
	build_sub(l,mid,ls,fa);
	build_sub(mid+1,r,rs,fa);
	pushup(k,fa);
}
void build(int l,int r,int k)
{
	tree[k].l=l;
	tree[k].r=r;
	build_sub(0,1000,1,k);
	if(l==r)
		return;
	int mid=tree[k].mid();
	build(l,mid,ls);
	build(mid+1,r,rs);
}
void update_sub(int pos,int val,int k,int fa)
{
	if(tree[fa].subtree[k].l==tree[fa].subtree[k].r)
	{
		tree[fa].subtree[k].val=max(tree[fa].subtree[k].val,val);
		//printf("update: l=%d r=%d val=%d\n",tree[fa].subtree[k].l,tree[fa].subtree[k].r,tree[fa].subtree[k].val);
		return;
	}
	int mid=tree[fa].subtree[k].mid();
	if(pos<=mid)
		update_sub(pos,val,ls,fa);
	else
		update_sub(pos,val,rs,fa);
	pushup(k,fa);
}
void update(int pos1,int pos2,int val,int k)
{
	update_sub(pos2,val,1,k);
	if(tree[k].l==tree[k].r)
	{
		return;
	}
	int mid=tree[k].mid();
	if(pos1<=mid)
		update(pos1,pos2,val,ls);
	else
		update(pos1,pos2,val,rs);
}
int query_sub(int l,int r,int k,int fa)
{
	if(tree[fa].subtree[k].l>=l&&tree[fa].subtree[k].r<=r)
	{
		//printf("sl=%d sr=%d val=%d\n",tree[fa].subtree[k].l,tree[fa].subtree[k].r,tree[fa].subtree[k].val);
		return tree[fa].subtree[k].val;
	}
	int mid=tree[fa].subtree[k].mid();
	if(r<=mid)
	{
		return query_sub(l,r,ls,fa);
	}
	else if(l>mid)
	{
		return query_sub(l,r,rs,fa);
	}
	else
	{
		int t1=query_sub(l,mid,ls,fa);
		int t2=query_sub(mid+1,r,rs,fa);
		return max(t1,t2);
	}
}
int query(int l,int r,int sl,int sr,int k)
{
	if(tree[k].l>=l&&tree[k].r<=r)
	{
		//printf("l=%d r=%d\n",tree[k].l,tree[k].r);
		//printf("sl=%d sr=%d\n",sl,sr);
		return query_sub(sl,sr,1,k);
	}
	int mid=tree[k].mid();
	if(r<=mid)
		return query(l,r,sl,sr,ls);
	else if(l>mid)
		return query(l,r,sl,sr,rs);
	else
	{
		int t1=query(l,mid,sl,sr,ls);
		int t2=query(mid+1,r,sl,sr,rs);
		return max(t1,t2);
	}
}
int main()
{
	int n,x,y,pos1,i;
	double pos2,val,a,b;
	while(scanf("%d",&n)==1&&n)
	{
		char op[2];
		build(100,200,1);
		while(n--)
		{
			scanf("%s",op);
			if(op[0]=='I')
			{
				scanf("%d%lf%lf",&pos1,&pos2,&val);
				x=(int)((pos2+1e-9)*10);
				y=(int)((val+1e-9)*10);
				update(pos1,x,y,1);
			}
			else
			{
				scanf("%d%d%lf%lf",&x,&y,&a,&b);
				int aa=(int)((a+1e-9)*10);
				int bb=(int)((b+1e-9)*10);
				if(x>y)
					swap(x,y);
				if(aa>bb)
					swap(aa,bb);
				int ans=query(x,y,aa,bb,1);
				if(ans<0)
				{
					printf("-1\n");
					continue;
				}
				double ans1=ans*1.0/10;
				printf("%.1f\n",ans1);
			}
		}
	}
	return 0;
}
/*
2
I 170 69.3 96.5
Q 144 184 38.3 69.2
*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值