【第3题】P3372 【模板】线段树 1

洛谷——P3372 【模板】线段树 1 阅读详情

题目

题目原文请移步下面的链接

  • https://www.luogu.com.cn/problem/P3372
    • 参考题解:https://www.luogu.com.cn/problem/solution/P3372
  • 标签:OI、数据结构、线段树

坑点

  • 错误

    CLion C++ Process finished with exit code -1073740940 (0xC0000374)
    
  • 现象

    • Step1: 调试的时候,执行到第12行代码就会退出,最初我是用scanf读取数据,后来改成cin一样不行。

    • Step2: 后来求助老码农,帮我看看,他在mac本上执行没问题,可以正常跑,在我的windows上就挂了,后来他尝试注释掉第8行,就能正常读取数据。所以断定是第8行方法又问题。

    • Step3: 问题找到了,接下来就是我小码匠闪亮登场时间,自己挖的坑,自己还是要填了。是因为树组开销了,越界导致。

      void best_coder() {
          int n, m;
          cin >> n >> m;
          Segment_Tree st(n);
          for (int i = 1; i <= n; ++i) {
              cin >> st.a[i];
          }
          st.build(1, 1, n);
          int q, x, y;
          long long v;
          for (int i = 0; i < m; ++i) {
              cin >> q;
              if (q == 1) {
                  cin >> x >> y >> v;
                  st.cnt(1,x, y, v);
      
              } else {
                  cin >> x >> y;
                  cout << st.query(1, x, y) << endl;
              }
          }
      }
      

题解

思路
  • 思路在这就不分享了,网络上很多,我也是看资料,边学边调试。
代码
#include <bits/stdc++.h>

using namespace std;
typedef long long LL;

struct edge {
    int l, r;
    LL sum, add;
};

struct Segment_Tree {
    vector<edge> t;
    vector<LL> a;

    Segment_Tree(int n) : t(400040), a(n + 1){}

    void push_up(int u) {
        t[u].sum = t[u << 1].sum + t[u << 1 | 1].sum;
    }

    void push_down(int u) {
        auto &root = t[u], &left = t[u << 1], &right = t[u << 1 | 1];
        if (root.add) {
            // 分析中的懒标记操作
            left.add += root.add;
            left.sum += (left.r - left.l + 1) * root.add;
            right.add += root.add;
            right.sum += (right.r - right.l + 1) * root.add;
            root.add = 0;
        }
    }

    void build(int u, int l, int r) {
        t[u].l = l;
        t[u].r = r;
        if (l == r) {
            t[u].sum = a[l];
            return;
        }
        int mid = l + r >> 1;
        build(u << 1, l, mid);
        build(u << 1 | 1, mid + 1, r);
        push_up(u);
    }

    LL query(int u, int l, int r) {
        if (t[u].l >= l && t[u].r <= r) {
            return t[u].sum;
        }
        push_down(u);
        int mid = t[u].l + t[u].r >> 1;
        LL s = 0;
        if (l <= mid) {
            s = query(u << 1, l, r);
        }
        if (r > mid) {
            s += query(u << 1 | 1, l, r);
        }
        return s;
    }

    void modify(int u, int x, LL v) {
        if (t[u].l == x && t[u].r == x) {
            t[u].sum = v;
        } else {
            int mid = (t[u].l + t[u].r) >> 1;
            if (x <= mid) {
                modify(u << 1, x, v);
            } else {
                modify(u << 1 | 1, x, v);
            }
            push_up(u);
        }
    }

    void cnt(int u, int l, int r,  LL v) {
        if (t[u].l >= l && t[u].r <= r) {
            t[u].sum += (t[u].r - t[u].l + 1) * v;
            t[u].add += v;
        } else {
            push_down(u);
            int mid = t[u].l + t[u].r >> 1;
            if (l <= mid) {
                cnt(u << 1, l, r, v);
            }
            if (r > mid) {
                cnt(u << 1 | 1, l, r, v);
            }
            push_up(u);
        }
    }
};

void best_coder() {
    int n, m;
    cin >> n >> m;
    Segment_Tree st(n);
    for (int i = 1; i <= n; ++i) {
        cin >> st.a[i];
    }
    st.build(1, 1, n);
    int q, x, y;
    long long v;
    for (int i = 0; i < m; ++i) {
        cin >> q;
        if (q == 1) {
            cin >> x >> y >> v;
            st.cnt(1,x, y, v);

        } else {
            cin >> x >> y;
            cout << st.query(1, x, y) << endl;
        }
    }
}

void happy_coder() {
}

int main() {
    // 提升cin、cout效率
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    // 小码匠
    best_coder();

    // 最优解
    // happy_coder();

    // 返回
    return 0;
}

小码匠上初中后,平时作业比较多,课余时间都奉献给一方键盘和数学公式。

有时间我会把文章发布到优快云,和更多的小伙伴分享我的学习心路。

P3372 【模板】线段树 1 树状数组 逆天的树状数组做法 阅读详情

相关推荐

# P3372 【模板】线段树 1

# P3372 【模板】线段树 1

adam_life的博客 801

洛谷 - P3372 线段树1

洛谷 - P3372 线段树1

cowgoodsheep的博客 779

洛谷P3372 【模板】线段树 1以及分块

分块

pi314159265a的博客 1015

洛谷 P3372:线段树 1 ← 分块算法模板(区间更新、区间查询)

● 本题其实就是线段树的模板题,这里用来练习分块。分块适合求解 m=n=10^5 规模的问题。或 m*sqrt(n)≈10^7 的问题。其中,n 为元素个数,m 为操作次数。

hnjzsyjyj的专栏 1557

P3372 【模板】线段树 1(树状数组(区间修改/查询))

【代码】P3372 【模板】线段树 1(树状数组(区间修改/查询))

勿忘勿失的博客 372

MATLAB绘图中文乱码终极解决方案:从方框到清晰显示的全面指南

本文提供了MATLAB绘图中文乱码的全面解决方案。针对中文显示为方框的问题,从单次绘图的临时字体设置,到通过修改默认配置实现一劳永逸,再到系统级字体排查与Java环境配置,给出了详细的步骤指南。文章还涵盖了字体名称指定、图像导出防丢失以及跨平台协作等高级技巧,帮助用户彻底解决中文乱码困扰。

weixin_29093017的博客 614

洛谷 P3372 【模板】线段树 1

线段树简单理解

qq_17807067的博客 1050

Mamba实战:如何用Samba框架轻松搞定RGB-D显著性检测(附避坑指南)

本文提供了基于Samba框架进行RGB-D显著性目标检测的实战指南。详细解析了从环境配置、数据预处理到模型推理与可视化的全流程,并重点剖析了多模态数据融合中的常见陷阱与调试技巧,旨在帮助开发者高效部署这一基于Mamba的先进视觉模型,规避工程实践中的典型问题。

dapp9builder的博客 615

P3372 【模板】线段树 1【题解1】

此篇为第1篇,用线段树做,并讲解线段树相关知识

cyx20091026的博客 910

超实用!用ChimeraX对AlphaFold 结果可视化(中): 蛋白结构美化篇

而一般需要的背景颜色是无色(白色),有三种方法可以更改背景颜色,这里我们介绍两种方法,第三种在下一小节中讲解。如果想选中蛋白链中的某一结构区域或者某些位点,可以用Ctrl+Shift+鼠标左键,或在软件窗口中点击。在这个窗口中可以对蛋白的主链、侧链、表面等颜色进行修改,只用在。,即可在右下角看到我们蛋白的序列信息,在这里面直接用鼠标选择要选择的结构域。就会有更多的颜色供我们选择,如果有特定的色号还可以在这个界面继续选择。后面的颜色(②),就可以选择想要的任何背景颜色(③)。就可以选择软件推荐的常用颜色。

m0_63153079的博客 5483

P3372 【模板】线段树 1

输出包含若干行整数,即为所有操作 2 的结果。,分别表示该数列数字的个数和操作的总个数。保证任意时刻数列中所有元素的绝对值之和。个用空格分隔的整数,其中第。

no_play_no_games的博客 967

[EDA系列]二、Altium Designer异形封装实战:从CAD导入到PCB布局

本文详细介绍了在Altium Designer中实现异形封装的实战流程。通过五步核心操作,将CAD软件中的复杂二维轮廓精准导入并转换为可直接用于PCB布局的智能封装,解决了不规则形状铺铜的难题,特别适用于射频天线、传感器外壳等对机械尺寸有严苛要求的设计场景。

weixin_29194817的博客 144

P3372 【模板】线段树 1【题解2】

本题题解分两篇,此篇为第2篇,用树状数组做。

cyx20091026的博客 990

FT601Q芯片深度解析:从USB3.0引脚定义到FPGA FIFO协议实战选型

本文深入解析FT601Q芯片在USB3.0接口设计与FPGA协议栈开发中的应用,详细介绍了USB3.0引脚定义、FT601Q芯片架构、245同步FIFO模式及硬件设计要点,帮助工程师实现高速数据传输系统。

weixin_30607659的博客 447

三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法

三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法

Robot_PLC_HMI_Automation 6514

P3372 【模板】线段树 1 题解

原题链接 简要题意: 维护一个数组的区间修改,区间查询。 关于区间问题,其实有很多不错的算法。 当然 树状数组 也可以解决,不过为了给 后一道模板 做铺垫,我们将本题作为 线段树 的模板题讲解。 线段树什么?顾名思义,每个节点都维护了一个线段的信息,并且 线段树是一棵完全二叉树 。 比方说: 其中每个节点上写的三个数分别表示:节点编号,区间左端点,区间右端点 。有些节点只写了 节点编号 ,因为它...

bifanwen的博客 963

计算机组成原理(第三版)唐朔飞-第九章控制单元的功能-课后习题

计算机组成原理(第三版)唐朔飞-第九章控制单元的功能-课后习题

weixin_45735391的博客 4万+

洛谷P3372 【模板】线段树1

洛谷P3372 【模板】线段树1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。 接下来M行每行包含3或4个整数,表示一个操作,具体如下: 操作1: 格式:1 x y ...

邮差将军的博客 218

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

洛谷P3372 【模板】线段树 1

P3372 【模板】线段树 1 题目链接-P3372 【模板】线段树 1 解题思路 线段树区间修改+区间查询 板子题,没什么说的,具体操作见代码 附上代码 #include<bits/stdc++.h> #define int long lon #define lowbit(x) (x &(-x)) #define endl '\n' using namespace ...

Fiveneves的博客 236

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: 【第2题】ARC159 - A - Copy and Paste Graph
下一篇: 【第4题】P2846 [USACO08NOV]Light Switching G
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小码匠和老码农

喜欢作者

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值