当前位置: 首页 > news >正文

2023 NOIP A层联测9 - 风信子 题解

思路

我们可以考虑设 f l 0 , r 0 , l 1 , r 1 f_{l_0,r_0,l_1,r_1} fl0,r0,l1,r1 表示最大的 a l − a r a_l-a_r alar,其中 l ∈ [ l 0 , r 0 ] l\in [l_0,r_0] l[l0,r0] r ∈ [ l 1 , r 1 ] r\in [l_1, r_1] r[l1,r1]

于是如果我们能够快速求出 f f f 值,那么我们就能解决问题。

考虑如何快速求 f f f 值。

发现似乎没有什么好方法,但是我们在某些特殊情况下是可以快速求的,即当 l 0 = l 1 l_0=l_1 l0=l1 r 0 = r 1 r_0=r_1 r0=r1 r 0 < l 1 r_0<l_1 r0<l1 时,我们可以用线段树快速求出其 f f f 值。

我们又发现刚开始给出的左右两边端点能取的区间是一样的,于是我们考虑当取出这区间的最大值之后,如何拆分区间使得拆分出来的区间满足上面的特殊情况。

l 0 = l 1 l_0=l_1 l0=l1 r 0 = r 1 r_0=r_1 r0=r1 时,我们假设此时最大值的为 a x − a y a_x - a_y axay,当我们取出 a x − a y a_x - a_y axay 后,我们就不能再取 ( x , y ) (x,y) (x,y) 这对数了,此时我们的左右端点的区间会改变,于是我们可以将改变后的区间拆为如下六种形式。

  • 左端点 ∈ [ l , x − 1 ] \in [l, x - 1] [l,x1],右端点 ∈ [ l , x − 1 ] \in[l, x - 1] [l,x1],此时 x > l x > l x>l
  • 左端点 ∈ [ l , x − 1 ] \in [l, x - 1] [l,x1],右端点 ∈ [ x , r ] \in[x, r] [x,r],此时 x > l x > l x>l
  • 左端点 ∈ [ x , x ] \in [x, x] [x,x],右端点 ∈ [ x , x ] \in[x, x] [x,x],此时 x ≠ y x \not = y x=y
  • 左端点 ∈ [ x , x ] \in [x, x] [x,x],右端点 ∈ [ x + 1 , y − 1 ] \in[x + 1, y - 1] [x+1,y1],此时 x < y − 1 x < y - 1 x<y1
  • 左端点 ∈ [ x , x ] \in [x, x] [x,x],右端点 ∈ [ y + 1 , r ] \in[y + 1, r] [y+1,r],此时 y > r y > r y>r
  • 左端点 ∈ [ x + 1 , r ] \in [x + 1,r] [x+1,r],右端点 ∈ [ x + 1 , r ] \in[x + 1, r] [x+1,r],此时 x < r x < r x<r

因为此时 l 0 = l 1 l_0 = l_1 l0=l1 r 0 = r 1 r_0 = r_1 r0=r1,所以我们用 l l l r r r 代替。

注意一下后面的条件,要满足其这个取值区间才会存在。

还有一种情况为 r 0 < l 1 r_0<l_1 r0<l1,此时拆分形式如下。

  • 左端点 ∈ [ l 0 , x − 1 ] \in [l_0, x - 1] [l0,x1],右端点 ∈ [ l 1 , r 1 ] \in[l_1, r_1] [l1,r1],此时 l 0 < x l_0 < x l0<x
  • 左端点 ∈ [ x , x ] \in [x, x] [x,x],右端点 ∈ [ l 1 , y − 1 ] \in[l_1, y - 1] [l1,y1],此时 l 1 < y l_1 < y l1<y
  • 左端点 ∈ [ x , x ] \in [x, x] [x,x],右端点 ∈ [ y + 1 , r 1 ] \in[y + 1, r_1] [y+1,r1],此时 y < r 1 y < r_1 y<r1
  • 左端点 ∈ [ x + 1 , r 0 ] \in [x + 1, r_0] [x+1,r0],右端点 ∈ [ l 1 , r 1 ] \in[l_1, r_1] [l1,r1],此时 x < r 0 x < r_0 x<r0

于是我们发现,当我们满足特殊条件时的区间,取出最大值后还是能变成满足特殊条件的区间,于是我们就可以做出来了。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL inf = 1e16;
int n, Q, a[100005];
LL bz[5000005];
struct Grid {LL val; int id;friend bool operator> (Grid a, Grid b) { return a.val > b.val; }friend bool operator< (Grid a, Grid b) { return a.val < b.val; }
} maxn[5000005], minn[5000005];
struct Ans {LL val; int x, y;friend bool operator> (Ans a, Ans b) { return a.val > b.val; }friend bool operator< (Ans a, Ans b) { return a.val < b.val; }
} ans[5000005];
inline void updata(int x) {maxn[x] = max(maxn[x * 2], maxn[x * 2 + 1]);minn[x] = min(minn[x * 2], minn[x * 2 + 1]);ans[x] = max(ans[x * 2], ans[x * 2 + 1]);if (maxn[x * 2].val - minn[x * 2 + 1].val > ans[x].val)ans[x].val = maxn[x * 2].val - minn[x * 2 + 1].val, ans[x].x = maxn[x * 2].id, ans[x].y = minn[x * 2 + 1].id;
}
inline void build(int x, int l, int r) {if (l == r) {maxn[x].val = minn[x].val = a[l], ans[x].val = 0;maxn[x].id = minn[x].id = ans[x].x = ans[x].y = l;return ;}int mid = l + r >> 1;build(x * 2, l, mid), build(x * 2 + 1, mid + 1, r);updata(x);
}
inline void pushdown(int x) {maxn[x].val += bz[x], minn[x].val += bz[x];bz[x * 2] += bz[x], bz[x * 2 + 1] += bz[x];bz[x] = 0;
}
inline void add(int x, int l, int r, int sl, int sr, int val) {pushdown(x);if (r < sl || sr < l)return ;if (sl <= l && r <= sr) {bz[x] += val;pushdown(x);return ;}int mid = l + r >> 1;add(x * 2, l, mid, sl, sr, val), add(x * 2 + 1, mid + 1, r, sl, sr, val);updata(x);
}
inline Grid find_max(int x, int l, int r, int sl, int sr) {pushdown(x);if (r < sl || sr < l)return { -inf, 0 };if (sl <= l && r <= sr)return maxn[x];int mid = l + r >> 1;return max(find_max(x * 2, l, mid, sl, sr), find_max(x * 2 + 1, mid + 1, r, sl, sr));
}
inline Grid find_min(int x, int l, int r, int sl, int sr) {pushdown(x);if (r < sl || sr < l)return { inf, 0 };if (sl <= l && r <= sr)return minn[x];int mid = l + r >> 1;return min(find_min(x * 2, l, mid, sl, sr), find_min(x * 2 + 1, mid + 1, r, sl, sr));
}
inline Ans find_ans(int x, int l, int r, int sl, int sr) {pushdown(x);if (r < sl || sr < l)return { -inf, 0, 0 };if (sl <= l && r <= sr)return ans[x];int mid = l + r >> 1;Ans t = max(find_ans(x * 2, l, mid, sl, sr), find_ans(x * 2 + 1, mid + 1, r, sl, sr));Grid a = find_max(x * 2, l, mid, sl, sr), b = find_min(x * 2 + 1, mid + 1, r, sl, sr);t = max(t, {a.val - b.val, a.id, b.id});return t;
}
struct node {int il, ir, jl, jr;LL val;Ans Val() {if (ir < jl) {Grid l = find_max(1, 1, n, il, ir), r = find_min(1, 1, n, jl, jr);return { l.val - r.val, l.id, r.id };}elsereturn find_ans(1, 1, n, il, ir);}friend bool operator< (node a, node b) { return a.val < b.val; }
} ;
priority_queue <node> q;
int main() {scanf("%d%d", &n, &Q);for (int i = 1; i <= n; i++)scanf("%d", &a[i]);build(1, 1, n);while (Q--) {int opt, L, R, k;scanf("%d%d%d%d", &opt, &L, &R, &k);if (opt == 1)add(1, 1, n, L, R, k);else {node t;t.il = t.jl = L, t.jr = t.ir = R;t.val = t.Val().val;q.push(t);LL sum = 0;while (k) {node now = q.top();Ans val = now.Val();int x = val.x, y = val.y;q.pop(), k--;sum = sum + val.val;if (now.ir < now.jl) {if (x > now.il) {t.il = now.il, t.ir = x - 1, t.jl = now.jl, t.jr = now.jr;t.val = t.Val().val;q.push(t);}if (now.jl < y) {t.il = x, t.ir = x, t.jl = now.jl, t.jr = y - 1;t.val = t.Val().val;q.push(t);}if (y < now.jr) {t.il = x, t.ir = x, t.jl = y + 1, t.jr = now.jr;t.val = t.Val().val;q.push(t);}if (x < now.ir) {t.il = x + 1, t.ir = now.ir, t.jl = now.jl, t.jr = now.jr;t.val = t.Val().val;q.push(t);}}else {int l = now.il, r = now.ir;if (x > l) {t.il = l, t.ir = x - 1, t.jl = l, t.jr = x - 1;t.val = t.Val().val;q.push(t);t.il = l, t.ir = x - 1, t.jl = x, t.jr = r;t.val = t.Val().val;q.push(t);}if (x != y) {t.il = x, t.ir = x, t.jl = x, t.jr = x;t.val = t.Val().val;q.push(t);}if (x < y - 1) {t.il = x, t.ir = x, t.jl = x + 1, t.jr = y - 1;t.val = t.Val().val;q.push(t);}if (y < r) {t.il = x, t.ir = x, t.jl = y + 1, t.jr = r;t.val = t.Val().val;q.push(t);}if (x < r) {t.il = x + 1, t.ir = r, t.jl = x + 1, t.jr = r;t.val = t.Val().val;q.push(t);}}}printf("%lld\n", sum);while (!q.empty())q.pop();}}return 0;
}

相关文章:

2023 NOIP A层联测9 - 风信子 题解

思路 我们可以考虑设 f l 0 , r 0 , l 1 , r 1 f_{l_0,r_0,l_1,r_1} fl0​,r0​,l1​,r1​​ 表示最大的 a l − a r a_l-a_r al​−ar​&#xff0c;其中 l ∈ [ l 0 , r 0 ] l\in [l_0,r_0] l∈[l0​,r0​]&#xff0c; r ∈ [ l 1 , r 1 ] r\in [l_1, r_1] r∈[l1​,r1​…...

岩土工程安全监测无线振弦采集仪在无线组网的关键要点

岩土工程安全监测无线振弦采集仪在无线组网的关键要点 岩土工程是一种奇特而又极其重要的工程。它涉及到土地、岩石、气候等等因素&#xff0c;需要重视安全因素。而无线振弦采集仪作为一种常用的监测设备&#xff0c;可以采集岩土工程中的振动数据&#xff0c;从而确保工程的…...

代码随想录Day14 LeetCodeT110平衡二叉树 T257二叉树的所有路径 T404 左叶子之和

以下思路来自于: 代码随想录 (programmercarl.com) LeetCode T110 平衡二叉树 题目链接:110. 平衡二叉树 - 力扣&#xff08;LeetCode&#xff09; 题目思路 前面我们说过了,求二叉树的深度我们应该使用前序遍历,求二叉树的高度我们应该使用后序遍历,因为后序遍历可以将子树的…...

C语言自定义类型_枚举联合(3)

目录 枚举 什么是枚举类型&#xff1f; 枚举的声明 枚举的定义 枚举的优点 枚举的使用 联合&#xff08;共用体&#xff09; 什么是联合呢&#xff1f; 联合类型的定义 联合的特点 联合使用 联合大小的计算 联合的应用 今天接着我们来结束自定义类型。&#x1f19…...

asp.net网上销售系统VS开发mysql数据库web结构c#编程Microsoft Visual Studio计算机毕业设计

一、源码特点 asp.net 网上销售系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为mysql&#xff0c;使用c#语言开发 aspnet 网上销售系统1 二、功能介绍 前台功能…...

【Windows】RPC调用过程实例详解

概述&#xff1a;windows 创建 RPC调用过程实例详解 参考文章&#xff1a;Remote procedure call (RPC)&#xff08;远程过程调用 (RPC)&#xff09; - Win32 apps | Microsoft Learn 文章目录 0x01、生成 UUID 和模版(IDL)文件0x02、添加 acf 文件0x03、编译 idl 文件0x04、客…...

动手学强化学习第2章多臂老虎机

2.1简介 多臂老虎机问题可以被看作简化版的强化学习问题。但是其只有动作和奖励没有状态信息&#xff0c;算是简化版的强化学习问题。 2.2问题介绍 2.2.1问题定义 在多臂老虎机(MAB)问题中&#xff0c;有一个有K根拉杆的老虎机&#xff0c;拉动每一根拉杆都对应一个关于奖励…...

钡铼BL124EC实现EtherCAT转Ethernet/IP的优势

钡铼技术的BL124EC是一款用于将EtherCAT从站转换为Ethernet/IP从站的网关设备。它是钡铼技术开发的高性能、可靠的工业自动化通信解决方案之一。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; BL124EC网关可以应用于多种工业自动化场景&#xff0c;以下…...

使用IntelliJ Idea必备的插件!

趁手的工具让开发事半功倍&#xff0c;好用的IDEA插件让效率加倍。 今天给大家分享几个优秀的IDEA插件。 插件安装 首先得知道在IDEA哪安装插件&#xff1f; 点击File---->Settings---->找到Plugins标签&#xff0c;即可搜索想要的插件进行安装了。 现在来看下有哪些值…...

代码随想录算法训练营第23期day19| 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

目录 一、&#xff08;leetcode 654&#xff09;最大二叉树 二、&#xff08;leetcode 617&#xff09;合并二叉树 三、&#xff08;leetcode 700&#xff09;二叉搜索树中的搜索 四、&#xff08;leetcode 98&#xff09;验证二叉搜索树 一、&#xff08;leetcode 654&…...

第四章 字符串part02 28. 实现strStr() 459. 重复的子字符串

第四章 字符串part02 28. 实现strStr() 459. 重复的子字符串 一、28. 实现strStr() 题目链接&#xff1a;https://leetcode.cn/problems/repeated-substring-pattern/ 题目介绍&#xff1a; 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。…...

设计模式 - 状态模式

目录 一. 前言 二. 实现 一. 前言 状态模式&#xff08;State Pattern&#xff09;&#xff1a;它主要用来解决对象在多种状态转换时&#xff0c;需要对外输出不同的行为的问题。状态和行为是一一对应的&#xff0c;状态之间可以相互转换。当一个对象的内在状态改变时&#x…...

【vim 学习系列文章 9 -- .vim 脚本文件开发学习】

文章目录 .vimrc 介绍.vim 脚本文件开发 .vimrc 介绍 在Vim中&#xff0c;你可以将一系列的Vim命令和设置写入一个脚本文件中&#xff0c;并使用:source命令来运行它。这种脚本文件通常被称为vimrc文件&#xff0c;因为它的默认名称是.vimrc。通常&#xff0c;我们将这个文件放…...

NAT模式和桥接模式的区别

NAT模式和桥接模式的区别 NAT模式和桥接模式都是虚拟机网络配置的两种方式&#xff0c;主要区别在于虚拟机与外部网络交互的方式不同。 NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;模式&#xff1a;在这种模式下&#xff0c;虚拟机和宿主…...

应对出海安全合规挑战,兆珑科技为什么选择了亚马逊云科技?

在中国企业出海进程中&#xff0c;安全合规是企业面临的首要挑战。尤其是当企业业务涉及金融相关领域时&#xff0c;面临着最为严苛的安全合规要求。 深圳兆珑科技有限公司是一家全球化的物联网生态企业&#xff0c;其业务覆盖100多个国家和地区&#xff0c;在欧洲、南美、亚太…...

Allegro基本规则设置指导书之Spacing规则设置

进入规则设置界面 1.设置Line 到其他的之间规则: 2.设置Pins 到其他的之间规则: 3.设置Vias 到其他的之间规则:...

使用【Blob、Base64】两种方式显示【文本、图片、视频】 使用 video 组件播放视频

Blob 显示 Blob 对象的类型是由 MIME 类型&#xff08;Multipurpose Internet Mail Extensions&#xff09;来确定的。MIME 类型是一种标准&#xff0c;用于表示文档、图像、音频、视频等多媒体文件的类型。以下是一些常见的 Blob 对象类型&#xff1a; text/plain&#xff1…...

深度学习_1_基本语法

数据结构 代码&#xff1a; import torchx torch.arange(12)##产生长度为12的一维张量print(x)##X x.resize(3, 4)##被弃用##print(X)y torch.reshape(x, (3, 4))##修改向量为矩阵&#xff0c;一维变二维print(y)print(y.size())xx torch.zeros((2, 3, 4))##三维矩阵&…...

c#设计模式-行为型模式 之 中介者模式

&#x1f680;简介 又叫调停模式&#xff0c;定义一个中介角色来封装一系列对象之间的交互&#xff0c;使原有对象之间的耦合松散&#xff0c;且可以独立地改变它们之间的交互。 从下右图中可以看到&#xff0c;任何一个类的变 动&#xff0c;只会影响的类本身&#xff0c;以及…...

小程序uView2.X框架upload组件上传方法总结+避坑

呈现效果: 1.1单图片上传 1.2多图片上传 前言:相信很多人写小程序会用到uView框架,总体感觉还算OK吧,只能这么说,肯定也会遇到图片视频上传,如果用到这个upload组件相信你,肯定遇到各种各样的问题,这是我个人总结的单图片和多图片上传方法. uView2.X框架:uView 2.0 - 全面兼容…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

LangChain【6】之输出解析器:结构化LLM响应的关键工具

文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器&#xff1f;1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...