数据结构:二维线段树

二维线段树是一种数据结构,用于支持单点修改和二维区间查询操作。每个外层线段树节点包含内层线段树的根节点,内层线段树需动态开点。在修改和查询时,通过在外层线段树中锁定一维,再在内层线段树中处理另一维来完成操作。这种数据结构在解决一些特定问题如POJ2029, POJ1195和洛谷4093时非常有用。" 47415023,4884863,Matlab绘制地理热度图指南,"['Matlab', '热度图', 'GIS']
摘要由CSDN通过智能技术生成

顾名思义,二维线段树就是在一棵线段树的每一个节点,都保存着另一棵线段树的根节点编号。

二维线段树通常支持以下2种功能:

1、单点修改;

2、二维区间查询。

为了实现这两种功能,我们需要建一棵外层线段树(可以动态开点也可以静态开点),对于外层线段树的每一个节点,我们都保存一个内层线段树的根节点编号(内层线段树必须动态开点,否则MLE)。

代码:

#define sz 100000
struct hh
{
    long long lson,rson,rt;//左儿子,右儿子,内层线段树根节点编号 
}out[sz<<1];//外层线段树 
struct hhh
{
    long long lson,rson,v;//左儿子,右儿子,值 
}in[sz<<7];//内层线段树

在单点修改时,要在外层线段树查询点的一维,并沿途修改内层线段树。内层线段树查询点的另一维,找到后修改并回溯。

代码:

#define sz 100000 
void modify_in(int &k,int l,int r,int y,int v)//内层修改 
{
    if (!k) k=++cnt2;//动态开点 
    in[k].v=max(in[k].v,v);//更新节点值 
    if (l==r) return;//修改完毕 
    int mid=(l+r)>>1;
    if (y<=mid) modify_in(in[k].lson,l,mid,y,v);
    else modify_in(in[k].rson,mid+1,r,y,v);
}
void m
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值