洛谷 P1253 扶苏的问题 题解 线段树

题解 P1253 【线性存储问题】 本题核心思想:长度×频率 很多人不知道为什么是这个式子,两片题解说的也不是很清楚,我来详细解释一下。 小学知识:百分率 我们会忽略题目中的: 使用的频率(万分比,在0到9000之间) 这是一个万分率,我们不难想,用长度×万分率得到的就是第aia_iai​段信息的查询时间。 为什么呢? 通常,我们在生活中说“某物体长度使用的频率就是人们检索的时间”。 正好和这题对上号。 以上是分析,下面... 阅读详情

扶苏的问题

题目描述

给定一个长度为 nnn 的序列 aaa,要求支持如下三个操作:

  1. 给定区间 [l,r][l, r][l,r],将区间内每个数都修改为 xxx。
  2. 给定区间 [l,r][l, r][l,r],将区间内每个数都加上 xxx。
  3. 给定区间 [l,r][l, r][l,r],求区间内的最大值。

输入格式

第一行是两个整数,依次表示序列的长度 nnn 和操作的个数 qqq。
第二行有 nnn 个整数,第 iii 个整数表示序列中的第 iii 个数 aia_iai​。
接下来 qqq 行,每行表示一个操作。每行首先有一个整数 opopop,表示操作的类型。

  • 若 op=1op = 1op=1,则接下来有三个整数 l,r,xl, r, xl,r,x,表示将区间 [l,r][l, r][l,r] 内的每个数都修改为 xxx。
  • 若 op=2op = 2op=2,则接下来有三个整数 l,r,xl, r, xl,r,x,表示将区间 [l,r][l, r][l,r] 内的每个数都加上 xxx。
  • 若 op=3op = 3op=3,则接下来有两个整数 l,rl, rl,r,表示查询区间 [l,r][l, r][l,r] 内的最大值。

输出格式

对于每个 op=3op = 3op=3 的操作,输出一行一个整数表示答案。

样例 #1

样例输入 #1

6 6
1 1 4 5 1 4
1 1 2 6
2 3 4 2
3 1 4
3 2 3
1 1 6 -1
3 1 6

样例输出 #1

7
6
-1

样例 #2

样例输入 #2

4 4
10 4 -3 -7
1 1 3 0
2 3 4 -4
1 2 4 -9
3 1 4

样例输出 #2

0

数据规模与约定

  • 对于 10%10\%10% 的数据,n=q=1n = q = 1n=q=1。
  • 对于 40%40\%40% 的数据,n,q≤103n, q \leq 10^3n,q≤103。
  • 对于 50%50\%50% 的数据,0≤ai,x≤1040 \leq a_i, x \leq 10^40≤ai​,x≤104。
  • 对于 60%60\%60% 的数据,op≠1op \neq 1op=1。
  • 对于 90%90\%90% 的数据,n,q≤105n, q \leq 10^5n,q≤105。
  • 对于 100%100\%100% 的数据,1≤n,q≤1061 \leq n, q \leq 10^61≤n,q≤106,1≤l,r≤n1 \leq l, r \leq n1≤l,r≤n,op∈{1,2,3}op \in \{1, 2, 3\}op∈{1,2,3},∣ai∣,∣x∣≤109|a_i|, |x| \leq 10^9∣ai​∣,∣x∣≤109。

提示

请注意大量数据读入对程序效率造成的影响。

思路

线段树上维护三个值:w,add,mdy。它们分别为区间最值,加数的懒标记,赋值的懒标记。当赋值懒标记存在时,加数标记改为在赋值标记 mdy 的值上加数;否则在加数懒标记 add 的值上加数。这样,在下传懒标记的时候,我们只需判断是下传 mdy 懒标记,还是下传 add 懒标记,还是不下传懒标记。因为在上述的打标记操作下,懒标记 mdy 和懒标记 add 不可能同时存在。此外,本题需注意数据范围:类型记得开long long int,读入数据的效率需优化。

代码

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
typedef long long ll;

#define lc (p << 1)
#define rc (p << 1 | 1)

const int maxn = 1e6 + 6;
i64 a[maxn];

struct node
{
    int l, r;
    i64 w, add, mdy; // 懒标记add和mdy
} tr[maxn * 4];

void pushup(int p)
{
    tr[p].w = max(tr[lc].w, tr[rc].w); // w维护区间最大值
}

void lazy_mdy(int p, i64 k) // 更新p结点mdy的懒标记
{
    tr[p].w = k;
    tr[p].mdy = k; // 更新赋值标记mdy
    tr[p].add = 0; // 一旦存在赋值,先前的增加全部失效
}

void lazy_add(int p, i64 k) // 更新p结点add的懒标记
{
    tr[p].w += k;
    if (tr[p].mdy != LLONG_MAX) // 如果存在赋值标记,则在赋值标记上增加k
        tr[p].mdy += k;
    else // 否则在add标记上增加k
        tr[p].add += k;
}

void pushdown(int p) // 下传懒标记
{
    if (tr[p].mdy != LLONG_MAX)
    {
        lazy_mdy(lc, tr[p].mdy);
        lazy_mdy(rc, tr[p].mdy);
        tr[p].mdy = LLONG_MAX;
    }
    else if (tr[p].add != 0)
    {
        lazy_add(lc, tr[p].add);
        lazy_add(rc, tr[p].add);
        tr[p].add = 0;
    }
}

// 建树
void build(int p, int l, int r) // p是当前位置,l和r表示区间
{
    if (l == r)
    {
        tr[p] = {l, r, a[l], 0, LLONG_MAX};
        return;
    }
    int mid = l + r >> 1;
    build(lc, l, mid);
    build(rc, mid + 1, r);
    tr[p] = {l, r, max(tr[lc].w, tr[rc].w), 0, LLONG_MAX};
}

// 区间修改
void modify(int p, int x, int y, i64 k)
{
    if (x <= tr[p].l && tr[p].r <= y)
    {
        lazy_mdy(p, k);
        return;
    }
    int mid = tr[p].l + tr[p].r >> 1;
    pushdown(p);
    if (x <= mid)
        modify(lc, x, y, k);
    if (y > mid)
        modify(rc, x, y, k);
    pushup(p);
}

// 区间增加
void update(int p, int x, int y, i64 k)
{
    if (x <= tr[p].l && tr[p].r <= y)
    {
        lazy_add(p, k);
        return;
    }
    int mid = tr[p].l + tr[p].r >> 1;
    pushdown(p);
    if (x <= mid)
        update(lc, x, y, k);
    if (y > mid)
        update(rc, x, y, k);
    pushup(p);
}

// 区间询问最大值
i64 query(int p, int x, int y) // p是当前位置,x和y表示区间
{
    if (x <= tr[p].l && tr[p].r <= y) // 已覆盖则返回该部分的结果
        return tr[p].w;
    int mid = tr[p].l + tr[p].r >> 1;
    pushdown(p);
    i64 ans = LLONG_MIN;
    if (x <= mid)
        ans = max(ans, query(lc, x, y));
    if (y > mid)
        ans = max(ans, query(rc, x, y));
    return ans;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n, q;
    cin >> n >> q;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    build(1, 1, n);
    while (q--)
    {
        int op;
        cin >> op;
        if (op == 1)
        {
            int l, r;
            i64 x;
            cin >> l >> r >> x;
            modify(1, l, r, x);
        }
        else if (op == 2)
        {
            int l, r;
            i64 x;
            cin >> l >> r >> x;
            update(1, l, r, x);
        }
        else
        {
            int l, r;
            cin >> l >> r;
            cout << query(1, l, r) << '\n';
        }
    }

    return 0;
}
洛谷P1253 扶苏的问题 P1253 扶苏的问题给定一个长度为 nnn 的序列 aaa,要求支持如下三个操作:第一行是两个整数,依次表示序列的长度 nnn 和操作的个数 qqq。 第二行有 nnn 个整数,第 iii 个整数表示序列中的第 iii 个数 aia_iai​。 接下来 qqq 行,每行表示一个操作。每行首先有一个整数 opopop,表示操作的类型。对于每个 op=3op = 3op=3 的操作,输出一行一个整数表示答案。...... 阅读详情

相关推荐

【线段树】P1253 扶苏的问题|普及+

给定一个长度为 $n$ 的序列 $a$,要求支持如下三个操作: 1. 给定区间 $[l, r]$,将区间内每个数都修改为 $x$。 2. 给定区间 $[l, r]$,将区间内每个数都加上 $x$。 3. 给定区间 $[l, r]$,求区间内的最大值。 ## 输入格式 第一行是两个整数,依次表示序列的长度 $n$ 和操作的个数 $q$。 第二行有 $n$ 个整数,第 $i$ 个整数表示序列中的第 $i$ 个数 $a_i$。 接下来 $q$ 行,每行表示一个操作。每行首先有一个整数 $op$,表示

闻缺陷则喜何志丹 870

P1253 扶苏的问题(洛谷)(线段树)

tag值存两个,一个覆盖值,一个累加值,再开一个变量存是否有覆盖值。因为覆盖值可能为零,也可以置为一个极小的值作为覆盖值是否存在的判断条件(如-1e18),除了注释的部分要注意一下以外,其余纯模板。

m0_73949397的博客 598

CANOE DIVA 工程怎样在具体服务前增加前置条件

然后会在CANoe的Test Module视窗中发现一个跟系统条件相关的Test Module模块,在该模块中有生成跟系统条件相关的CAPL 脚本。这里需要根据你的实际项目进行更改,diva工程加载到canoe的工程的时候,会同步加入你创建的cdd文件,这里示例的ABS_ESP 就是你的cdd的ECU命名,后面就是具体的前置条件服务。4、配置完成后,测试用例就会如下图Trace窗口所示,在每一次10 02请求之前都会调用CAPL Function的PreconditionCheck函数中定义的脚本。

weixin_45940007的博客 1963

luogu1253 扶苏的问题 题解

线段树入门题目之一

SHOJYS的博客 900

STM32CUBEMX | STM32L431RCT6的内部Flash操作

一、STM32CUBEMX配置 1、选择芯片型号: 2、配置时钟源 1、 如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC; 2、 如果使用默认内部时钟(HSI),这一步可以略过; 3、配置时钟树 STM32L4的最高主频到80M,所以配置PLL,最后使HCLK = 80Mhz即可: 4、代码生成设置 点击GENERATE CODE即可生成MDK-V5工程: 二、在MDK中编写、编译、下载用户代码 1、STM32内部Flash及HAL库API 查看所使用芯片的信息,

yongridada的博客 5568

游戏安全逆向实战:如何用010Editor绕过ACE反作弊的文件校验(附详细步骤)

本文详细介绍了如何通过逆向工程思维和010Editor工具,针对PC游戏中ACE反作弊系统的文件校验机制进行分析与绕过。文章以实战案例为核心,逐步拆解了定位校验逻辑、解析校验数据文件、计算并替换哈希值的关键步骤,为安全研究人员提供了一种在用户态(Ring 3)层面进行轻量化对抗的思路与方法。

iii12的专栏 725

扶苏的问题题解

扶苏的问题题解

fengenrong的博客 1118

4D毫米波雷达点云可视化实战:从CANFD原始数据到Matplotlib三维动态图

本文详细介绍了4D毫米波雷达点云可视化实战,从CANFD原始数据解析到Matplotlib三维动态图实现的全流程。通过解析CANFD数据帧结构、点云数据编码原理,并结合Python实现CANFD通信接口,帮助开发者掌握4D雷达数据处理与优化技巧,最终实现高性能的3D点云动态可视化。

u9v0w的博客 568

扶苏的问题(线段树)

给定一个长度为n的序列alrxlrxlr。

m0_60738889的博客 750

量子磁场测量技术在生物磁场成像领域的应用现状与产业趋势

首先对量子磁场测量技术的发展进行了简述,然后介绍了量子磁场测量技术在生物磁场成像领域的应用,最后分析了量子磁场测量技术的两大重要应用方向(心磁图仪和脑磁图仪)及其产业现状和未来发展趋势。美国普林斯顿大学在《自然》上公布了目前人类磁场测量灵敏度最高的基于量子磁场测量技术的零场原子磁力计。拥有巨大的发展潜力及庞大的市场空间。因此其数千万元的高昂售价及每年数百万元的超导维护成本限制了超导式心磁图仪的发展和临床应用。而基于超导式脑磁图仪的癫痫、阿尔兹海默症、抑郁症等脑疾病患者的临床研究也取得丰富的研究成果。

罗伯特技术屋 1528

LeRobot 入门教程(九)使用 Android、iOS 手机控制机械臂

本指南详细介绍了如何使用iOS/Android手机远程控制机器人。内容包括:1)安装依赖(pip install leroobot[phone]);2)平台支持说明(iOS需HEBI Mobile I/O应用/Android用WebXR);3)手机方向校准方法;4)控制模式设定(按钮/手势);5)示例脚本使用(遥操作/数据记录/回放/策略评估);6)关键参数配置(运动学/安全限制/夹爪控制);7)故障排查方法。支持ROS2集成,提供URDF文件处理、逆向运动学计算和实时可视化功能,适用于物理机器人和仿真环境

2506_90492529的博客 1657

【洛谷P1253】扶苏的问题【线段树】

Luogu linkLuogu~linkLuogu link 分析: 线段树 主要在于懒标记下传 CODE: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int N=1e6+5; ll n,T,a[N]; struct SegmentTre.

绫 590

【第一章】基于Simulink的控制器开发教程——目录

摘要:本文系统介绍了基于Simulink的控制器开发方法,涵盖PID、状态反馈、模型预测(MPC)、模糊控制、自适应控制等8类主流控制器。针对每种控制器,详细阐述了其基本原理、适用场景,并通过Simulink建模与仿真测试进行实践验证。文章采用"理论+实践"的结构,从算法设计到硬件实现全流程展开,为汽车、航空航天、工业控制等领域的控制器开发提供完整解决方案,最后通过应用对比与学习总结帮助读者掌握不同控制器的核心特性和应用场景。(149字)

熟悉MATLAB/fpga/RK3588/LABVIEW/protus/单片机/dsp/Multisim 386

洛谷 P1253 扶苏的问题 java题解+线段树

【代码】洛谷 P1253 扶苏的问题 java题解+线段树

weixin_64192249的博客 975

从零开始学习PX4源码9(部署px4源码到gitee)

由于PX4-Autopilot托管在github,在没有翻墙的情况下,下载固件无法下载。为了提高下载速度,这里将PX4在github上的仓库以及其子仓库(依赖仓库)都搬移到gitee上了。本教程讲解如何快速部署px4固件到gitee上,实现不需要翻墙快速本地就可以下载PX4固件。暂时没有找到如何批量直接通过修改.gitmodules后,使用什么命令可以直接把所有的一级二级子模块的指向直接正常映射。!!

陌城烟雨 810

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

洛谷 P1253 扶苏的问题-普及+/提高

线段树两种运算的一种改版,每个节点存储是否有要向下修改的值,和待加的值,push_down 时注意区别有没有改的值。行,每行表示一个操作。请注意大量数据读入对程序效率造成的影响。第一行是两个整数,依次表示序列的长度。的操作,输出一行一个整数表示答案。个整数表示序列中的第。

weixin_37253733的博客 1259

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

P1253 [yLOI2018] 扶苏的问题(洛谷)(线段树)

P1253 [yLOI2018] 扶苏的问题(洛谷)(线段树)

ck的博客 650

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

洛谷P1253 扶苏的问题(范围重置、范围增加,维护区间最大值)

洛谷P1253 扶苏的问题(范围重置、范围增加,维护区间最大值)

2301_80085990的博客 559

P1253 扶苏的问题

题目描述。

weixin_61067952的博客 533

P1253 扶苏的问题-线段树

P1253 扶苏的问题-线段树-线段树模板2,需要考虑优先级的情况,代码比比较长,容易写错,需要注意一下。

2401_82683560的博客 486

关于洛谷题目P1253 扶苏的问题

另外,最后一个测试点会卡常,可采取cstdio输入,也可以ios::sync_with_stdio(0);cin.tie(0);解除cin的绑定,但注意不要解除cout的绑定,没用(边读边输出的话);当然,你也可以手写快读。知识点:线段树同时支持范围重置、范围增加、范围查询 维护最大值。注意:因为每次操作的 x≤1e9,所以注意要开。

wmwq_dk的博客 329

【题解·洛谷】B3713 [语言月赛202302] 对了,还有花,少女,银河

洛谷B3713 题解

qq_56897740的博客 1326

P1253 [yLOI2018] 扶苏的问题 (线段树)

原题链接:[yLOI2018] 扶苏的问题 - 洛谷 思路: 1.其实就是用线段树进行简单的区间修改(每个数修改为x, 每个数加x)和区间查询。因为有两种区间修改,所以分别用upd和add数组来标记; 2.两个操作之间的关系:每次一个区间若修改为x,那么区间的add就要清空为0。每次下传标记先下传区间的update再下传add; 3.pushup维护区间最大值; 4.update改变整个区间每个值为x之后还是得要下传add操作,因为有一部分区间可能不会被这样更新,例如rt为1即区间范..

qq_52313416的博客 1325

Turtle Puzzle: Rearrange and Negate(Round 929)

【代码】Turtle Puzzle: Rearrange and Negate(Round 929)

GordrnGhost的博客 878

[yLOI2018] 扶苏的问题

线段树

m0_62597063的博客 483

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 222
上一篇: VOJ 迷阵突围 题解 次短路径 dijkstra算法
下一篇: 2024 Jiangsu Collegiate Programming Contest E. Divide 题解 主席树
bbc_ouo
博客等级 码龄3年 2096粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值