Luck and Love HDU - 1823

本文介绍了一种使用二维线段树实现区间更新与查询的方法,并通过示例代码详细展示了如何处理浮点数精度问题及左右端点大小判断。适用于解决涉及二维坐标系中矩形区域的最值更新和查询问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击打开链接

点更新区间查询模板 但有两个坑

1 左右端点大小未定 需要判断 这个已经见怪不怪

2 精度问题 要用float

#include <cstdio>
#include <map>
#include <cstring>
#include <algorithm>
using namespace std;

float maxx[810][4010];
float ans;
int n,c,q;

void pushupy(int curx,int cury)
{
    maxx[curx][cury]=max(maxx[curx][cury*2],maxx[curx][cury*2+1]);
    return;
}

void pushupx(int tary,int l,int r,int curx,int cury)
{
    int m;
    maxx[curx][cury]=max(maxx[curx*2][cury],maxx[curx*2+1][cury]);
    if(l==r) return;
    m=(l+r)/2;
    if(tary<=m) pushupx(tary,l,m,curx,cury*2);
    else pushupx(tary,m+1,r,curx,cury*2+1);
    return;
}

void queryy(int yl,int yr,int l,int r,int curx,int cury)
{
    int m;
    if(yl<=l&&r<=yr)
    {
        ans=max(ans,maxx[curx][cury]);
        return;
    }
    m=(l+r)/2;
    if(yl<=m) queryy(yl,yr,l,m,curx,cury*2);
    if(yr>=m+1) queryy(yl,yr,m+1,r,curx,cury*2+1);
    return;
}

void queryx(int xl,int xr,int yl,int yr,int l,int r,int curx)
{
    int m,res;
    if(xl<=l&&r<=xr)
    {
        queryy(yl,yr,0,c,curx,1);
        return;
    }
    m=(l+r)/2;
    if(xl<=m) queryx(xl,xr,yl,yr,l,m,curx*2);
    if(xr>=m+1) queryx(xl,xr,yl,yr,m+1,r,curx*2+1);
    return;
}

void updatey(int tary,float val,int l,int r,int curx,int cury)
{
    int m;
    if(l==r)
    {
        maxx[curx][cury]=max(maxx[curx][cury],val);
        return;
    }
    m=(l+r)/2;
    if(tary<=m) updatey(tary,val,l,m,curx,cury*2);
    else updatey(tary,val,m+1,r,curx,cury*2+1);
    pushupy(curx,cury);
    return;
}

void updatex(int tarx,int tary,float val,int l,int r,int curx)
{
    int m;
    if(l==r)
    {
        updatey(tary,val,0,c,curx,1);
        return;
    }
    m=(l+r)/2;
    if(tarx<=m) updatex(tarx,tary,val,l,m,curx*2);
    else updatex(tarx,tary,val,m+1,r,curx*2+1);
    pushupx(tary,0,c,curx,1);
    return;
}

int main()
{
    float y1,y2,val,t1;
    int x1,x2,t2;
    int i,j,xl,xr,yl,yr;
    char op[10];
    while(scanf("%d",&q)!=EOF)
    {
        if(q==0) break;
        for(i=1;i<=800;i++)
        {
            for(j=0;j<=4000;j++)
            {
                maxx[i][j]=-1.0;
            }
        }
        n=200,c=1000;
        for(i=1;i<=q;i++)
        {
            scanf("%s",op);
            if(op[0]=='I')
            {
                scanf("%d%f%f",&x1,&y1,&val);
                y1*=10.0;
                updatex(x1,y1,val,1,n,1);
            }
            else
            {
                scanf("%d%d%f%f",&x1,&x2,&y1,&y2);
                y1*=10.0,y2*=10.0;
                if(x1>x2) t2=x1,x1=x2,x2=t2;
                if(y1>y2) t1=y1,y1=y2,y2=t1;
                ans=-1.0;
                queryx(x1,x2,y1,y2,1,n,1);
                if(ans!=-1.0)
                {
                    printf("%.1f\n",ans);//
                }
                else printf("-1\n");
            }
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值