首页 > 其他分享 >数据结构(4天)

数据结构(4天)

时间:2023-06-05 20:44:21浏览次数:50  
标签:lazy return int fa build pushdown 数据结构

带权并查集:

  维护一个数组,保存一个fa[x]与x之间的关系,路径压缩时直接要记得修改关系

int find(int x)
{
    if(fa[x]==x)
    {
        return fa[x];
    }
    int root=find(fa[x]);
    w[x]=f(w[x],w[fa[x]]);//关键
    fa[x]=root;
    return fa[x];
}

对于区间修改:

  1)差分

  2)懒标记

线段树:

  要求:具有结合律

  难点:1)思考节点中的信息,以及如何上传、下传

      2)debug

  

struct segment_tree{
    int l,r,lazy,dat;
} t[N*4];

int a[N];
int n,m;
inline void pushdown(segment_tree &u,segment_tree &l,segment_tree &r)
{
    l.lazy+=u.lazy,r.lazy+=u.lazy;
    l.dat+=u.lazy*(l.r-l.l+1),r.dat+=u.lazy*(r.r-r.l+1);
    u.lazy=0;
    return ;
}

inline void pushdown(int u)
{
    pushdown(t[u],t[u<<1],t[u<<1|1]);
    return ;
}

inline void pushup(segment_tree &u,segment_tree l,segment_tree r)
{
    u.dat=l.dat+r.dat;
    return ;
}

inline void pushup(int u)
{
    pushup(t[u],t[u<<1],t[u<<1|1]);
    return ;
}


void build(int u,int l,int r)
{
    auto &s=t[u];
    s.l=l,s.r=r;
    if(l==r)
    {
        s.lazy=0;
        s.dat=a[l];
        return ;
    }
    int mid=(l+r)>>1;
    build(u<<1,l,mid);
    build(u<<1|1,mid+1,r);
    pushup(u);
}

void add(int u,int l,int r,int x)
{
    auto &s=t[u];
    if(l<=s.l && s.r<=r)
    {
        s.lazy+=x;
        s.dat+=x*(s.r-s.l+1);
        return ;
    }
    int mid=(s.l+s.r)>>1;
    if(s.lazy)
    {
        pushdown(u);
    }
    if(l<=mid) add(u<<1,l,r,x);
    if(mid<r) add(u<<1|1,l,r,x);
    pushup(u);
    return ;
}

int ask(int u,int l,int r)
{
    auto &s=t[u];
    if(l<=s.l && s.r<=r)
    {
        return s.dat;
    }
    int ret=0;
    int mid=(s.l+s.r)>>1;
    if(s.lazy)
    {
        pushdown(u);
    }
    if(l<=mid) ret+=ask(u<<1,l,r);
    if(mid+1<=r) ret+=ask(u<<1|1,l,r);
    return ret;
}
View Code

 

树状数组:

  常见:单点修改、区间查询

可持久化数据结构:

  含义:保存历史状况的数据结构扩展

  要求:数据结构修改中,拓扑结构不变

  方式:每次操作增加一个次版本的根,然后与上一版本连接,并新建出这次修改的节点,使得从此次的根进入可以得到此次修改后的状态

int build(int l,int r)
{
    int p=++cnt;
    auto &s=t[p];
    if(l>=r)
    {
        return p;
    }
    int mid=(l+r)>>1;
    s.lc=build(l,mid);
    s.rc=build(mid+1,r);
    return p;
}

int change(int v,int l,int r,int x)
{
    int p=++cnt;
    auto &s=t[p];
    s=t[v];
    s.dat++;
    if(l>=r)
    {
        return p;
    }
    int mid=(l+r)>>1;
    if(x<=mid) s.lc=change(t[v].lc,l,mid,x);
    else s.rc=change(t[v].rc,mid+1,r,x);
    return p;
}

 

AC自动机:

  带有类似KMP的nxt数组的trie结构,可以做到多模式串匹配

  

void build()
{
    int q[T],head=1,tail=0;
//根和第一层的ne指向根(类似前缀函数)
    for(int i=0;i<26;i++)
    {
        if(to[0][i])
        {
            q[++tail]=to[0][i];//入队第一层的结点
        }
    }
    while(head<=tail)
    {
        int u=q[head++];
        for(int i=0;i<26;i++)
        {
            int t=to[u][i];
            if(!t) to[u][i]=to[ne[u]][i];    //为了保证查询的线性,可以类比路径压缩
            else ne[t]=to[ne[u]][i],q[++tail]=t;//类比前缀函数
        }
    }

值域思想:

  维护一段值域(类似桶),内容为值域区间内数的总个数,可以快速查询很多东西(比如第k大数)

扫描线思想:

  看例题

  247. 亚特兰蒂斯 - AcWing题库

  发现其实总面积是一个个横向切割后得到的矩形面积之和

  具体方法: 

    假设数对(x1,x2,y,w)  ,下边为(x1,x2,y1,1),上边为(x1,x2,y2,-1) ,按照y排序,每个矩形的高为y[i]-y[i-1],宽为扫描线上非零点个数,然后将扫描线上[x1,x2]区间加上w(值域线段树)(记得离散化)

标签:lazy,return,int,fa,build,pushdown,数据结构
From: https://www.cnblogs.com/Ga1ahad-and-Scientific-Witchery/p/17458897.html

相关文章

  • 数据结构小结
    个人认为数据结构有点偏向理论知识点,从这些理论知识点,我们可以知道各种数据结构的特点,然后在特定的场景下使用对应的数据结构来存储。基础的数据结构从逻辑上来说基础的数据结构只有线性结构、非线性结构,也就是数组、链表。其他复杂一点的如队列、栈、树、图、hashtable都可......
  • 数据结构第一天
    数据>数据元素>数据项 数据项是构成数据元素的不可分割的最小单位 数据是由数据项组成的,数据项是由数据元素组成的 数据元素-----组成数据的基本单位与数据的关系:是集合的个体 数据对象------性质相同的数据元素的集合与数据的关系:是集合的子集  数据元素......
  • C#数据结构-红黑树实现
    参考网址: https://zhuanlan.zhihu.com/p/353948322二叉查找树,他对于大多数情况下的查找和插入在效率上来说是没有问题的,但是他在最差的情况下效率比较低。红黑树保证在最坏的情况下插入和查找效率都能保证在对数的时间复杂度内完成。红黑树的性质:性质1.节点是红色或黑色性质2.根是......
  • 数据结构--Dijkstra算法最清楚的讲解
    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止###基本思想通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。此外,引进两个集合S和U。S的......
  • [学习笔记]数据结构_线性表_顺序表and单链表
    线性表线性表是一种逻辑结构,表示元素之间一对一的相邻关系。顺序表和链表是指存储结构,两者属于不同层面上的概念。线性表的基本操作boolInitList(&L)//初始化表,构造一个空的线性表intLength(L)//求表长。返回线性表L的长度,即L中数据元素的个数intLocateElem(L,e)//按......
  • R数据结构-列表
    列表(List)是一种数据结构,它可以包含不同类型的对象,包括向量、矩阵、数据框、函数等。列表允许您将多个对象组合到一个结构中,以便以统一的方式进行处理和访问#创建一个包含向量、矩阵和数据框的列表vec<-c(1,2,3)mat<-matrix(1:9,nrow=3)df<-data.frame(x=c(1,2......
  • 《数据结构》之栈和堆结构及JVM简析
    导言:在数据结构中,我们第一了解到了栈或堆栈,它的结构特点是什么呢?先进后出,它的特点有什么用呢?我们在哪里可以使用到栈结构,栈结构那么简单,使用这么久了为什么不用其它结构替代?一.程序在内存中的分布作为一个程序猿,我们应该会常常跟代码打交道,那么我们所编写的程序或代码,是怎么跑......
  • C/C++数据结构设计题[2023-06-04]
    C/C++数据结构设计题[2023-06-04]停车场模拟管理程序的设计与实现1.设计目的理解线性表的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。2.问题描述设停车场只有一个可停放几辆汽车的狭长通道,只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺......
  • 数据结构(I)
    1链表1.1单链表模板:AcWing826.单链表题目:实现一个单链表,实现以下\(3\)种操作:Hx向链表头插入一个数\(x\);Dx删除第\(x\)个插入的数(若\(x=0\),表示删除头结点);Ikx在第\(k\)个插入的数后插入一个数\(x\)(保证\(k>0\))。给你\(m\)次操作,输出最终链表。\(1......
  • 数据结构与算法-技巧类型题总结
    目录排序逆序排序逆序查询后矩阵的和......