存档【线段树】

这篇具有很好参考价值的文章主要介绍了存档【线段树】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

存一下写到一般的线段树

呃呃

1008-数据结构_2021秋季算法入门班第十一章习题:线段树、树状数组 (nowcoder.com)文章来源地址https://www.toymoban.com/news/detail-540201.html

#include <bits/stdc++.h>
 
#define int long long
 
using namespace std;
 
const int mxn=1e5+10;
const int mxe=1e5+10;
const int mod=1e9+7;
const int Inf=1e18;

struct info{
    int sum;
};

info operator+(const info &l,const info &r){
    info res;
    res.sum=l.sum+r.sum;
    return res;
}

struct tag{
    int add,mul;
};

struct Segtree{
    info val;
    tag t;
}tree[mxe<<2][3];
//1为区间和,2为区间平方和

int N,M,op,l,r,x;
int a[mxn];

void pushup(int rt){
    tree[rt][1].val=tree[rt<<1][1].val+tree[rt<<1|1][1].val;
    tree[rt][2].val=tree[rt<<1][2].val+tree[rt<<1|1][2].val;
}
void settag1(int rt,int tot){

}
void settag2(int rt,int tot){

}
void pushdown(int rt,int tot){
    for(int i=1;i<=2;i++){
        if(tree[rt][i].t.add!=0||tree[rt][i].t.mul!=1){
            if(i==1){
                settag1(rt<<1,tot-tot/2);
                settag1(rt<<1|1,tot/2);
            }else{
                settag2(rt<<1,tot-tot/2);
                settag2(rt<<1|1,tot/2);
            }
            tree[rt][i].t.add=0;
            tree[rt][i].t.mul=1;
            return;
        }
    }
}
void build(int rt,int l,int r){
    if(l==r){
        //tag
        tree[rt][1].t.add=tree[rt][2].t.add=0;
        tree[rt][1].t.mul=tree[rt][2].t.mul=1;
        //val
        tree[rt][1].val.sum=a[l];
        tree[rt][2].val.sum=a[l]*a[l];
        return;
    }
    int mid=l+r>>1;
    build(rt<<1,l,mid);
    build(rt<<1|1,mid+1,r);
    pushup(rt);
}
void modify(int rt,int l,int r,int x,int y,int k,int mode){
    if(x<=l&&r<=y){
        if(mode==1){
            //区间加
            settag1(rt,r-l+1);
            //1
            tree[rt][1].val.sum+=k*(r-l+1);
            //2
            tree[rt][2].val.sum=tree[rt][2].val.sum+2*k*tree[rt][1].val.sum+(r-l+1)*k*k;
        }else{
            //区间乘
            settag2(rt,r-l+1);
            //1
            tree[rt][1].val.sum*=k;
            //2
            tree[rt][2].val.sum*=k*k;
        }
        return;
    }
    pushdown(rt,r-l+1);
    int mid=l+r>>1;
    if(x<=mid) modify(rt<<1,l,mid,x,y,k,mode);
    if(y>mid) modify(rt<<1|1,mid+1,r,x,y,k,mode);
    pushup(rt);
}
info query(int rt,int l,int r,int x,int y,int mode){
    if(x<=l&&r<=y){
        if(mode==1){
            return tree[rt][1].val;
        }else{
            return tree[rt][2].val;
        }
    }
    pushdown(rt,r-l+1);
    int mid=l+r>>1;
    if(x>mid) return query(rt<<1|1,mid+1,y,x,y,mode);
    else if(y<=mid) return query(rt<<1,l,mid,x,y,mode);
    else{
        return query(rt<<1,l,mid,x,y,mode)+query(rt<<1|1,mid+1,r,x,y,mode);
    }
}
void solve(){
    cin>>N>>M;
    for(int i=1;i<=N;i++) cin>>a[i];
    build(1,1,N);
    while(M--){
        cin>>op;
        if(op==1){
            cin>>l>>r;
            cout<<query(1,1,N,l,r,1).sum<<'\n';
        }else if(op==2){
            cin>>l>>r;
            cout<<query(1,1,N,l,r,2).sum<<'\n';
        }else if(op==3){
            cin>>l>>r>>x;
            modify(1,1,N,l,r,x,2);
        }else{
            cin>>l>>r>>x;
            modify(1,1,N,l,r,x,1);
        }
    }
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int __=1;//cin>>__;
    while(__--)solve();return 0;
}

到了这里,关于存档【线段树】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构和算法——数据结构

    目录 线性结构  队列结构的队列 链表结构的队列 链表的面试题 单向链表应用场景 约瑟夫环问题 栈结构 中缀表达式 前缀表达式 后缀表达式 非线性结构 图 递归解决迷宫问题 递归解决八皇后问题 顺序存储方式,顺序表 常见的顺序存储结构有:数组、队列、链表、栈 链式存

    2024年02月07日
    浏览(56)
  • 数据结构与算法 --- 数据结构绪论

    早期人们都把计算机理解为数值计算工具,就是感觉计算机当然是用来计算的,所以计算机解决问题,应该是先从具体问题中抽象出一个适当的数据模型,设计出一个解此数据模型的算法,然后再编写程序,得到一个实际的软件。 可现实中,我们更多的不是解决数值计算的问

    2024年02月14日
    浏览(54)
  • 数据结构与算法——数据结构有哪些,常用数据结构详解

    数据结构是学习数据存储方式的一门学科,那么,数据存储方式有哪几种呢?下面将对数据结构的学习内容做一个简要的总结。 数据结构大致包含以下几种存储结构: 线性表,还可细分为顺序表、链表、栈和队列; 树结构,包括普通树,二叉树,线索二叉树等; 图存储结构

    2024年02月15日
    浏览(63)
  • 数据结构与算法——什么是数据结构

    当你决定看这篇文章,就意味着系统学习数据结构的开始。下面我们先来讲什么是数据结构。 数据结构,直白地理解,就是研究数据的存储方式。 我们知道,数据存储只有一个目的,即为了方便后期对数据的再利用,就如同我们使用数组存储  {1,2,3,4,5}  是为了后期取得它们

    2024年02月15日
    浏览(55)
  • 【数据结构与算法】不就是数据结构

      嗨喽小伙伴们你们好呀,好久不见了,我已经好久没更新博文了!之前因为实习没有时间去写博文,现在已经回归校园了。我看了本学期的课程中有数据结构这门课程(这么课程特别重要),因为之前学过一点,所以就想着深入学习一下子。毕竟这门课程对于 考研 和 就业

    2024年02月07日
    浏览(49)
  • 【数据结构与算法】1.数据结构绪论

    📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点,相互学习进步! 数据结构是计算机中存储、组织数据的方式。 数据结构是一种具有一定逻辑关系,

    2024年01月23日
    浏览(54)
  • 数据结构--》掌握数据结构中的排序算法

            当我们面对海量数据时,如何高效地将其排序是数据结构领域中一个重要的问题。排序算法作为其中的关键部分,扮演着至关重要的角色。         无论你是初学者还是进阶者,本文将为你提供简单易懂、实用可行的知识点,帮助你更好地掌握排序算法在数据

    2024年02月08日
    浏览(43)
  • 【数据结构与算法】一、数据结构的基本概念

    抽象数据类型(ADT)定义举例:Circle的定义 如何处理杂乱无章且多样化的数据: 数据元素 :数据中的个体被称为数据元素。 数据对象 :性质相同的数据元素组成的集合。 数据结构 :数据元素加上数据元素之间的关系,就形成了数据结构。 逻辑结构 :数据结构的逻辑模型。

    2023年04月17日
    浏览(99)
  • 数据结构--》掌握数据结构中的查找算法

            当你需要从大量数据中查找某个元素时,查找算法就变得非常重要。         无论你是初学者还是进阶者,本文将为你提供简单易懂、实用可行的知识点,帮助你更好地掌握查找在数据结构和算法中的重要性,进而提升算法解题的能力。接下来让我们开启数据

    2024年02月08日
    浏览(57)
  • 数据结构--》从数据结构开始,打好算法基础

    目录 数据结构的基本概念 数据结构的三要素 算法的基本概念 数据结构的基本概念         在学习某个知识之前,我们是否都有问过自己我们到底在学习的目的是什么?学习数据结构也一样,我们学习数据结构 主要是为了 用程序把现实世界的问题信息化;用计算机高效

    2024年02月09日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包