关于二维线段树,ta死了

先来看看两种二维线段树的打法

1.四叉树

然而ta死了,ta是$\Theta (n)$的,加上线段树的常数,$T$飞稳

2.线段树套线段树

我尽量画出来...

图中每个方块是一棵线段树

画完长这样(你们凑合看吧,作者已经半卒了)

局部放大图

现在每个圆点代表真正的一个点

接下来的讲解以今天的题为例(题面就不放了)

先说区间修改

假设我们现在要给图中的$9$个绿点赋值(仔细找,相信你能找到

按照一维线段树的做法,我们会修改这六个绿点

但这是$\Theta (NlogN)$的,会$T$

我们可以是这对蓝点进行操作

然后我们就可以只修改图中的四个绿点了

代码:

struct Tree
{
struct tree
{
int tag;
}t[maxn<<2];
void down(int k)
{
int tmp=t[k].tag;
t[l(k)].tag=max(t[l(k)].tag,tmp);
t[r(k)].tag=max(t[r(k)].tag,tmp);
}
void change(int k,int l,int r,int L,int R,int v)
{
if(L<=l&&r<=R){t[k].tag=v;return;}
down(k);int mid=(l+r)>>1;
if(L<=mid) change(l(k),l,mid,L,R,v);
if(mid<R) change(r(k),mid+1,r,L,R,v);
}
}T[maxn<<2];
void change(int k,int l,int r,int L,int R,int ll,int rr,int v)
{
if(L<=l&&r<=R){T[k].change(1,1,maxn-1,ll,rr,v);return;}
int mid=(l+r)>>1;
if(L<=mid) change(l(k),l,mid,L,R,ll,rr,v);
if(mid<R) change(r(k),mid+1,r,L,R,ll,rr,v);
}

接下来是单点查询

我们要查图中的绿点

但是我们并不能只查询这一个点,因为下图中三个黄色的方块里都有关于这个绿点的信息

所以我们只要一边向下走一边查询取$max/min$就可以了

代码:

int query(int k,int l,int r,int p)
{
if(l==r) return t[k].tag;
down(k);int mid=(l+r)>>1;
if(p<=mid) return query(l(k),l,mid,p);
else return query(r(k),mid+1,r,p);
}
int query(int k,int l,int r,int p1,int p2)
{
if(l==r){return T[k].query(1,1,maxn-1,p2);}
int ans=T[k].query(1,1,maxn-1,p2),mid=(l+r)>>1;
if(p1<=mid) return max(ans,query(l(k),l,mid,p1,p2));
else return max(ans,query(r(k),mid+1,r,p1,p2));
}

以及完整代码:

struct Tree
{
struct tree
{
int tag;
}t[maxn<<2];
void down(int k)
{
int tmp=t[k].tag;
t[l(k)].tag=max(t[l(k)].tag,tmp);
t[r(k)].tag=max(t[r(k)].tag,tmp);
}
void change(int k,int l,int r,int L,int R,int v)
{
if(L<=l&&r<=R){t[k].tag=v;return;}
down(k);int mid=(l+r)>>1;
if(L<=mid) change(l(k),l,mid,L,R,v);
if(mid<R) change(r(k),mid+1,r,L,R,v);
}
int query(int k,int l,int r,int p)
{
if(l==r) return t[k].tag;
down(k);int mid=(l+r)>>1;
if(p<=mid) return query(l(k),l,mid,p);
else return query(r(k),mid+1,r,p);
}
}T[maxn<<2];
void change(int k,int l,int r,int L,int R,int ll,int rr,int v)
{
if(L<=l&&r<=R){T[k].change(1,1,maxn-1,ll,rr,v);return;}
int mid=(l+r)>>1;
if(L<=mid) change(l(k),l,mid,L,R,ll,rr,v);
if(mid<R) change(r(k),mid+1,r,L,R,ll,rr,v);
}
int query(int k,int l,int r,int p1,int p2)
{
if(l==r){return T[k].query(1,1,maxn-1,p2);}
int ans=T[k].query(1,1,maxn-1,p2),mid=(l+r)>>1;
if(p1<=mid) return max(ans,query(l(k),l,mid,p1,p2));
else return max(ans,query(r(k),mid+1,r,p1,p2));
}

关于其他操作,有空在更(基本没空了

二维$MLE$线段树的更多相关文章

  1. 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2271  Solved: 935[Submit][Stat ...

  2. 【BZOJ 3196】二逼平衡树 线段树套splay 模板题

    我写的是线段树套splay,网上很多人写的都是套treap,然而本蒟蒻并不会treap 奉上sth神犇的模板: //bzoj3196 二逼平衡树,支持修改某个点的值,查询区间第k小值,查询区间某个值排 ...

  3. bzoj 3196 && luogu 3380 JoyOI 1730 二逼平衡树 (线段树套Treap)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3196 题面; 3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Se ...

  4. BZOJ3196二逼平衡树——线段树套平衡树(treap)

    此为平衡树系列最后一道:二逼平衡树您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询 ...

  5. BZOJ5291/洛谷P4458/LOJ#2512 [Bjoi2018]链上二次求和 线段树

    原文链接http://www.cnblogs.com/zhouzhendong/p/9031130.html 题目传送门 - LOJ#2512 题目传送门 - 洛谷P4458 题目传送门 - BZOJ ...

  6. BZOJ - 3196 Tyvj 1730 二逼平衡树 (线段树套treap)

    题目链接 区间线段树套treap,空间复杂度$O(nlogn)$,时间复杂度除了查询区间k大是$O(log^3n)$以外都是$O(log^2n)$的. (据说线段树套线段树.树状数组套线段树也能过?) ...

  7. 【bzoj3196】Tyvj 1730 二逼平衡树 线段树套Treap

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义 ...

  8. NYOJ 116 士兵杀敌(二)【线段树 单点更新】

    题意:题意非常清楚: 策略:如题. 这道题就是简单的线段树应用,据说还能够用树状数组来做,等我学了之后在说吧. 代码: #include<stdio.h> #include<stri ...

  9. [bzoj3196]Tyvj 1730 二逼平衡树——线段树套平衡树

    题目 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查 ...

随机推荐

  1. Spring AOP 创建Advice 基于Annotation

    public interface IHello { public void sayHello(String str); } public class Hello implements IHello { ...

  2. .NET子页Main页面实例(UI页面)

    <%@ Page Language="C#"  MasterPageFile="~/MasterPageDefault.master"   AutoEve ...

  3. windows下pyinstaller打包踩坑记录

    示例: 需要打包的是 ReadConfig.py 文件,同文件夹下调用了Interface.py文件,ui文件夹下调用了 Ui_config.py和Ui_Error.py文件,Interface.py ...

  4. spring boot 集成mybatis plus 含分页 完整教程

    一.添加依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus ...

  5. OO第三单元(地铁,JML)单元总结

    OO第三单元(地铁,JML)单元总结 这是我们OO课程的第二个单元,这个单元的主要目的是让我们熟悉并了解JML来是我们具有规格化编程架构的思想.这个单元的主题一开始并不明了,从第一次作业的路径到第二次 ...

  6. php生成一维码以及保存-转载

    地址:http://www.cnblogs.com/ForEvErNoME/archive/2012/04/21/2460944.html 注释掉: //header('Content-Type: i ...

  7. CSS知识整理

    1. 权重问题(CSS优先级): 继承或 * :0,0,0,0 标签:0,0,0,1 每个类,伪类:0,0,1,0 每个ID:0,1,0,0 每个行内式:1,0,0,0 !important:无穷大 ...

  8. ArcEngine二次开发中运行出现There is no Spatial Analyst license currently available or enabled.

    只需要在许可控件上勾选空间分析功能即可.

  9. sqlserver存储过程里传字段、传字符串,并返回DataTable、字符串,存储过程调用存储过程。

    经常需要查一些信息,  想写视图来返回数据以提高效率,但是用试视图不能传参,只好想到改存储过程.记录一下语法,方便以后做项目时候想不起来了用. 1:传字段返回datatable 2: 传字段回一串字符 ...

  10. DRF 视图初识

    from django.shortcuts import render from rest_framework.generics import ListAPIView,CreateAPIView,Up ...