P6242 【模板】线段树 3(区间最值操作、区间历史最值)

【模板】线段树 3(区间最值操作、区间历史最值) - 洛谷

#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl "\n"
#define PII pair<int,int>
#define int long long//当前节点存的懒标记是给下面用的
//spread就是给下面用的时候//我们或许对当前最大值maxa及时的加或减了
//但是没有对maxb做操作,或者说 **某个子区间的maxb可能就没有被更新过**//2024/4/30
//spread -> push_down
//这里保留的是向下更新前这期间的 历史最大的 标记
//
//之前“最值”的做法是错误的,懒标记频繁更新,可能就改不到最大懒标记了。 乱写,
////然后就是min的操作了
//不想一次改到底
//能做到改maxa时就可以停了。
//后续的maxa大于父maxa的就是要调整的
//调整多少呢?我们可以给个懒标记3//2024/5/1
//2操作时,不过确实有多个最大值就错了//你的老二可能比我的牢大大//t3更新的判断有误。可能当前又变了,子节点maxa没变过。
//懂了,其实改,肯定是改大的那个;!!!我们已经递归到只改一个的时候啦!!!
//而且次大值小于修改值,即最大值仍是最大值!//原来最大值的懒标记要分开,是为了更新maxb 。看了良久才看出来
//所以不是最大值(取min操作没取到的)也要统计maxb,所以普通懒标记也需要记录一个本次的最大 。  //区间加u1没有及时更新 maxt1 maxt3
//const int maxn = 5e5 + 5;
const int minv = -5e18;
//int MOD = LLONG_MAX;
class ST//segment tree
{struct node{ll val;//区间和ll maxa;//区间最大值ll seca;//区间次大值ll maxb;//区间历史最大值ll maxn;//最大值数目 用于最大值修改int t1;//加懒标记int maxt1;//不是最大值也要统计maxb,也需要最大懒标记int t2;//乘懒标记int t3;//最大值专属懒标记 VIPint maxt3;//期间最大加懒标记node(int v = 0) :val(v), maxa(0), seca(-2e9), maxb(0), maxn(1),t1(0), maxt1(0), t2(1), t3(0), maxt3(0){}};int n = a.size();vector<ll>a;vector<node>d;void build_tree(int i, int l, int r){if (l == r){d[i].val = d[i].maxa = d[i].maxb = a[l];return;}int mid = l + (r - l) / 2;build_tree(i * 2, l, mid);build_tree(i * 2 + 1, mid + 1, r);push_up(i);}void push_up(int i){d[i].val = (d[i * 2].val + d[i * 2 + 1].val);d[i].maxa = max(d[i * 2].maxa, d[i * 2 + 1].maxa);d[i].maxb = max(d[i * 2].maxb, d[i * 2 + 1].maxb);//不过确实有多个最大值就错了if (d[i * 2].maxa == d[i * 2 + 1].maxa){d[i].seca = max(d[i * 2].seca,d[i*2+1].seca);d[i].maxn = d[i * 2].maxn + d[i * 2 + 1].maxn;}else if (d[i * 2].maxa > d[i * 2 + 1].maxa){d[i].seca = max(d[i*2].seca,d[i * 2 + 1].maxa);d[i].maxn = d[i * 2].maxn;}else// if (d[i * 2].maxa < d[i * 2 + 1].maxa){d[i].seca = max(d[i * 2].maxa, d[i * 2 + 1].seca);d[i].maxn = d[i * 2 + 1].maxn;}}void change(int i, int l, int r, int t1, int maxt1,int t2,int t3, int maxt3){auto& self = d[i];//self.val = self.val * t2;//self.maxa = self.maxa * t2;//self.seca = self.seca * t2;//self.t1 *= t2;//self.t2 *= t2;self.val += t1 * (r - l + 1 - self.maxn) + t3*self.maxn;self.maxb = max(self.maxb, self.maxa + maxt3);self.maxa += t3;if(self.seca != -2e9)self.seca += t1;self.maxt1 = max(self.maxt1, self.t1 + maxt1);self.t1 += t1;self.maxt3 = max(self.maxt3, self.t3 + maxt3);self.t3 += t3;}void push_down(int i,int l,int r){//懒惰int t1 = d[i].t1, maxt1 = d[i].maxt1, t2 = d[i].t2, t3 = d[i].t3, maxt3 = d[i].maxt3;auto& lchild = d[i * 2], &rchild = d[i * 2 + 1];int maxatmp = max(lchild.maxa, rchild.maxa);int mid = l + (r - l) / 2;if (lchild.maxa == maxatmp)change(i*2,l,mid,t1, maxt1, t2,t3,maxt3);elsechange(i*2,l,mid,t1, maxt1, t2,t1,maxt1);//没专属if (rchild.maxa == maxatmp)change(i * 2 + 1, mid + 1, r, t1, maxt1, t2, t3, maxt3);elsechange(i * 2 + 1, mid + 1, r, t1, maxt1, t2, t1, maxt1);//复原d[i].t1 = d[i].maxt1 = d[i].maxt3 = d[i].t3 = 0;d[i].t2 = 1;}ll _getsum(int i, int l, int r, int aiml, int aimr){if (l > aimr || r < aiml)return 0;if (aiml <= l && r <= aimr)return d[i].val;int mid = l + (r - l) / 2;push_down(i,l,r);return _getsum(i * 2, l, mid, aiml, aimr) + _getsum(i * 2 + 1, mid + 1, r, aiml, aimr);}ll _getmaxa(int i, int l, int r, int aiml, int aimr){if (l > aimr || r < aiml)return LLONG_MIN;if (aiml <= l && r <= aimr)return d[i].maxa;int mid = l + (r - l) / 2;push_down(i,l,r);return max(_getmaxa(i * 2, l, mid, aiml, aimr), _getmaxa(i * 2 + 1, mid + 1, r, aiml, aimr));}ll _getmaxb(int i, int l, int r, int aiml, int aimr){if (l > aimr || r < aiml)return LLONG_MIN;if (aiml <= l && r <= aimr)return d[i].maxb;int mid = l + (r - l) / 2;push_down(i,l,r);return max(_getmaxb(i * 2, l, mid, aiml, aimr), _getmaxb(i * 2 + 1, mid + 1, r, aiml, aimr));}void _update1(int i, int l, int r, int aiml, int aimr, ll val){if (l > aimr || r < aiml)return;if (aiml <= l && r <= aimr){d[i].val = (d[i].val + val * (r - l + 1));d[i].maxa = d[i].maxa + val;d[i].maxb = max(d[i].maxb, d[i].maxa);if(d[i].seca != -2e9)d[i].seca += val;d[i].t1 += val;d[i].t3 += val;d[i].maxt1 = max(d[i].maxt1, d[i].t1);d[i].maxt3 = max(d[i].maxt3, d[i].t3);return;}int mid = l + (r - l) / 2;push_down(i,l,r);//因为要向下搜了,所以把当前的懒标记给下面兑现一下_update1(i * 2, l, mid, aiml, aimr, val);_update1(i * 2 + 1, mid + 1, r, aiml, aimr, val);push_up(i);}void _update2(int i, int l, int r, int aiml, int aimr, ll val){if (l > aimr || r < aiml)return;if (aiml <= l && r <= aimr){d[i].val = (d[i].val * val);d[i].t1 = (d[i].t1 * val);d[i].t2 = (d[i].t2 * val);return;}int mid = l + (r - l) / 2;push_down(i,l,r);_update2(i * 2, l, mid, aiml, aimr, val);_update2(i * 2 + 1, mid + 1, r, aiml, aimr, val);push_up(i);}void _update_min(int i, int l, int r, int aiml, int aimr, ll val){if (l > aimr || r < aiml || d[i].maxa <= val)return;if (aiml <= l && r <= aimr && d[i].seca < val){int k = d[i].maxa - val;d[i].val -= d[i].maxn* k;d[i].maxa = val;d[i].t3 -= k;return;}int mid = l + (r - l) / 2;push_down(i, l, r);_update_min(i * 2, l, mid, aiml, aimr, val);_update_min(i * 2 + 1, mid + 1, r, aiml, aimr, val);push_up(i);}
public:ll getsum(int l, int r){return _getsum(1, 1, n, l, r);}ll getmaxa(int l, int r){return _getmaxa(1, 1, n, l, r);}ll getmaxb(int l, int r){return _getmaxb(1, 1, n, l, r);}void update1(int l, int r, ll val){_update1(1, 1, n, l, r, val);//加并挂标记}void update2(int l, int r, ll val){_update2(1, 1, n, l, r, val);//加并挂标记}void update_min(int l, int r, ll val){_update_min(1, 1, n, l, r, val);}ST(vector<ll>arr){a = arr;n = a.size() - 1;d = vector<node>(4 * n);build_tree(1, 1, n);}
};//区间加完,子区间最大值也加
//交汇部分需要再比比signed main()
{ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int n, m;cin >> n >> m;vector<int>arr(1 + n);for (int i = 1; i <= n; i++)cin >> arr[i];ST demo(arr);for (int i = 0; i < m; i++){int op, l, r, val;cin >> op >> l >> r;switch (op){case 1:cin >> val;demo.update1(l, r, val);break;case 2:cin >> val;demo.update_min(l, r, val);break;case 3:cout << demo.getsum(l, r) << endl;break;case 4:cout << demo.getmaxa(l, r) << endl;break;case 5:cout << demo.getmaxb(l, r) << endl;break;}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/5690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

platformd device、driver注册过程

本文以smsc911x驱动为例 platform_device注册过程 该设备被定义在dts里面了 参考文章设备树节点转换为设备节点device_node、和平台设备资源platform_device_设备树节点转换成平台设备-CSDN博客 dts里面的节点会被转换为device_node和platform_device(并不是所有节点都会被转…

vi编辑器使用

说明&#xff1a;本文介绍vi编辑器使用&#xff1b; 介绍&基础使用 vi编辑器是linux操作系统中最常用的编辑器&#xff0c;使用vi或vim命令启动。vim是vi编辑器的增强版&#xff0c;大多数情况使用vi命令也会打开vim编辑器&#xff0c;为了方便介绍&#xff0c;以下均称v…

【数组】Leetcode 80. 删除有序数组中的重复项 II【中等】

删除有序数组中的重复项 II 其他算法导航栏 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在…

C#实战:图像清晰度增强介绍和案例实践

目录 一、图像清晰度增强介绍 二、开发流程 三、请求参数说明 四、输出参数说明

【Web】2024XYCTF题解(全)

目录 ezhttp ezmd5 warm up ezMake ez?Make εZ?мKε? 我是一个复读机 牢牢记住&#xff0c;逝者为大 ezRCE ezPOP ezSerialize ezClass pharme 连连看到底是连连什么看 ezLFI login give me flag baby_unserialize ezhttp 访问./robots.txt 继…

从阿里云崩溃看IT系统非功能能力验证

昨天下午6点左右学员群里有人说阿里云又出问题了&#xff0c;并且还挺长时间没有恢复了。 我也登录了一下&#xff0c;结果登录直接不停地302。如下所示&#xff1a; 做为阿里云重要的基础设施&#xff0c;这一故障影响了。如官方通告的处理时间线&#xff1a; 17:44起&#…

【JavaEE初阶系列】——理解tomcat 带你实现最简单的Servlet的hello world程序(七大步骤)

目录 &#x1f6a9;认识Tomcat &#x1f6a9;运用Tomcat &#x1f6a9;Servlet &#x1f393;完成简单的Servlet的hello world程序 &#x1f388;创建项目Maven &#x1f388;引入依赖 &#x1f388;创建目录 &#x1f388;编写代码 &#x1f388;打包程序 &#x1…

Go 语言基础(一)【基本用法】

前言 最近心情格外不舒畅&#xff0c;不仅仅是对前途的迷茫&#xff0c;这种迷茫倒是我自己的问题还好&#xff0c;关键它是我们这种普通吗喽抗衡不了的。 那就换个脑子&#xff0c;学点新东西吧&#xff0c;比如 Go&#xff1f; 1、Go 语言入门 介绍就没必要多说了&#xff0…

求矩阵对角线元素之和(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 0;int j 0;int sum 0;int a[3][3] { 0 };//获取数组a的值&#xff1b;printf(&qu…

『大模型笔记』Code Example: Function Calling with ChatGPT

Code Example: Function Calling with ChatGPT 文章目录 一. Code Example: Function Calling with ChatGPT二. 参考文献一. Code Example: Function Calling with ChatGPT from openai import OpenAI from dotenv import load_dotenv import json# --------------------------…

标准汽车试验铁地板的技术要求

在现代科技化发展的工作中&#xff0c;试验平台被广泛使用。铸铁试验平台&#xff08;试验铁地板&#xff09;又叫试验工作平台&#xff0c;听名字大家也不难想象出来这是一款带有箱式体的台面&#xff0c;这是一种有长方形或者圆形又或者正方形的试验工作台。 铸铁试验平台&a…

调用WinPE给现有的Windows做一个备份

前言 前段时间有小伙伴问我&#xff1a;如何让给电脑备份系统。 小白直接告诉他&#xff1a;为啥要备份系统呢&#xff1f;直接给电脑创建一个还原点就好了。 Windows还原点创建教程&#xff08;点我跳转&#xff09; 没想到小伙伴的格局比小白大得多&#xff0c;他说&…

2024年第二十一届 五一杯 (C题)大学生数学建模挑战赛 | 多目标优化问题,深度学习分析 | 数学建模完整代码解析

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享&#xff0c;与你一起了解前沿科技知识&#xff01; 本次DeepVisionary带来的是五一杯的详细解读&#xff1a; 完整内容可以在文章末尾全文免费领取&阅读&#xff01; 首先&…

前端项目学习记录3:mock接口

1.下载mock接口 pnpm i vite-plugin-mock 2.配置vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue import path from "path"; //引入svg需要用到的插件 import { createSvgIconsPlugin } from vite-plugin-svg-icons //mock插…

编码方式导致的csv文件错误

写入csv文件时&#xff0c;假如出现了csv文件是乱码的情况&#xff0c;那么说明编码方式有问题&#xff0c;需要修改一下编码方式为utf-8-sig。 把编码方式修改一下为encodingutf-8-sig &#xff0c;再次运行就不会是乱码了&#xff0c;可见再读写csv文件时&#xff0c;假如使用…

【报错处理】ib_write_bw执行遇到Found Incompatibility issue with GID types.原因与解决办法

文章目录 拓扑现象根因解决办法解决后效果 拓扑 #mermaid-svg-zheSkw17IeCpjnVA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-zheSkw17IeCpjnVA .error-icon{fill:#552222;}#mermaid-svg-zheSkw17IeCpjnVA .error…

Python语言零基础入门——模块

目录 一、模块的导入与使用 1.模块的导入 2.模块的使用 二、包的使用 1.包 2.包的使用 三、常见的标准库 1.random的运用举例 2.random小游戏 &#xff08;1&#xff09;石头剪刀布 &#xff08;2&#xff09;猜大小 3.re 4.time库的使用 5.turtle库的使用 6.so…

Java中的模版方法设计模式详解

Java中的模版方法设计模式详解 在Java编程中&#xff0c;设计模式是一种解决常见问题的最佳实践。其中&#xff0c;模版方法设计模式是一种行为设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中。这样可以使子类在不改变算法结构的情况…

手把手实现一个简约酷美美的版权声明模块

1. 导语 版权声明在很多网站都有用到&#xff0c;出场率还是很高的。所以今天就实现一个属于自己分风格的版权声明模块&#xff0c;技术上采用原生的前端三剑客: HTMLCSSJavaScript(可能会用到) 比如CSDN的版权声明是这样的 2. 需求分析 先看看成品吧&#xff0c;这篇文字结…

Access to image at ... from origin ... has been blocked

Access to image at ‘http://127.0.0.1:3000/api/getImg?url/uploads/file/20240421/file-1713715007811-logo.png’ from origin ‘http://ggbol.gnway.cc’ has been blocked by CORS policy: The request client is not a secure context and the resource is in more-pri…