关于此题[ABC343F] Second Largest Query 线段树合并类问题的一些总结

news/2025/1/23 14:51:49/文章来源:https://www.cnblogs.com/lwiwi/p/18687783

传送门

  • 题目大意:给定序列,每次操作可以单点修改以及询问每个区间内严格次大值出现次数。
  • 此类区间合并的线段树之前也做过,但是都没有一个固定的写法,导致调了很久都过不了,感觉上是写丑了。对于一个节点要维护多个信息,我们可以用结构体来实现,并且pushup操作,即左右儿子两个区间合并操作,可以直接返回node类型到当前节点,这样的好处是询问操作也直接用node作为返回值可以一个query就得到答案,不然还得一个query找次大值,再来个query找次大值出现次数。
  • 这里的合并操作可以分类讨论,也可以用set完成,我这里用的是set,写起来更加方便且不容易出错。
#include<bits/stdc++.h>using namespace std;long long t;
const long long N = 2e5 + 10;
long long n,m;
long long a[N];
struct node {long long max1,max2,num1,num2;
}tr[4*N];node up(node ls,node rs) {node res;res.max1 = res.max2 = res.num1 = res.num2 = 0;set<long long,greater<long long> > tq;tq.insert(ls.max1);tq.insert(ls.max2);tq.insert(rs.max1);tq.insert(rs.max2);set<long long>::iterator it = tq.begin();res.max1 = *it;if(ls.max1 == *it) res.num1 += ls.num1;if(ls.max2 == *it) res.num1 += ls.num2;if(rs.max1 == *it) res.num1 += rs.num1;if(rs.max2 == *it) res.num1 += rs.num2;it++;if(*it != 0) {res.max2 = *it;if(ls.max1 == *it) res.num2 += ls.num1;if(ls.max2 == *it) res.num2 += ls.num2;if(rs.max1 == *it) res.num2 += rs.num1;if(rs.max2 == *it) res.num2 += rs.num2;}return res;
}void build(long long k,long long l,long long r) {if(l == r) {tr[k].max1 = a[l];tr[k].num1 = 1;return;}long long mid = (l + r) >> 1;build(k * 2,l,mid);build(k * 2 + 1,mid + 1,r);tr[k] = up(tr[k * 2],tr[k * 2 + 1]);
}void modify(long long k,long long l,long long r,long long pos,long long v) {if(l > pos || r < pos) return;if(l == r && l == pos) {tr[k].max1 = a[l] = v;tr[k].max2 = 0;tr[k].num1 = 1;tr[k].num2 = 0;return ;}long long mid = (l + r) >> 1;modify(k * 2,l,mid,pos,v);modify(k * 2 + 1,mid + 1,r,pos,v);tr[k] = up(tr[k * 2],tr[k * 2 + 1]);
}node query(long long k,long long l,long long r,long long x,long long y) {if(l > y || r < x) return {0,0,0,0};if(l >= x && r <= y) return tr[k];long long mid = (l + r) >> 1;if(y <= mid) return query(k * 2,l,mid,x,y);else if(x > mid) return query(k * 2 + 1,mid + 1,r,x,y);else return up(query(k * 2,l,mid,x,y),query(k * 2 + 1,mid + 1,r,x,y));
}void solve() {cin >> n >> m;for(long long i = 1;i <= n;i++) cin >> a[i];build(1,1,n);for(long long i = 1;i <= m;i++) {long long pd,x,y;cin >> pd >> x >> y;if(pd == 1)modify(1,1,n,x,y);else cout << query(1,1,n,x,y).num2 << '\n';}
}signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);t = 1;while(t--) solve();return 0;
}

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

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

相关文章

深入探讨存储过程的创建与应用:提高数据库管理效率的关键工具

title: 深入探讨存储过程的创建与应用:提高数据库管理效率的关键工具 date: 2025/1/23 updated: 2025/1/23 author: cmdragon excerpt: 在数据驱动的商业环境中,数据库管理系统必须具备高效的操作能力。而存储过程作为一种封装的数据库逻辑,提供了一种有效的解决方案,以增…

大模型论文精选||多智能体微调:通过多样推理链实现自我提升

多智能体微调是一种实现自我提升的补充方法,它将微调应用于语言模型的多智能体群体。一组均基于相同基础模多智能体微调是一种实现自我提升的补充方法,它将微调应用于语言模型的多智能体群体。一组均基于相同基础模型的语言模型,通过模型间的多智能体交互生成的数据,分别对…

LWIP UDP使用

MCU: 小华HC32F4A0 板子没有合适的接口作为串口输出了,调试有点困难,想了个办法把lwip的UDP重定向到fputc函数 代码参考:https://www.cnblogs.com/54zorb/p/9609021.html UDP相关代码 /********************************* UDP测试 ************************************/ /*…

大模型论文精选|| 多 LLM 文本摘要:创新方法与卓越成果

多LLM文本摘要:创新方法与卓越成果 论文 https://arxiv.org/abs/2412.1多LLM文本摘要:创新方法与卓越成果论文 https://arxiv.org/abs/2412.15487 Multi-LLM Text Summarization 2412.15487 多LLM摘要框架在每一轮对话中有两个至关重要的步骤:生成和评估。根据使用的是多LLM…

国产化板卡设计原理图:2018-基于双FT-M6678 DSP的3U VPX的信号处理平台

基于双FT-M6678 DSP的3U VPX的信号处理平台一、板卡概述该板卡是由我公司自主研发的基于3U VPX架构的信号处理板,该处理板包含2片 FT-M6678 DSP芯片,1片 Spartan-3系列XC3S200AN配置芯片,两片DSP分别有1路RapidIO x4连接至VPX背板,两片DSP之间通过Hyperlink x4和SGMII互联。…

国产化板卡设计原理图:2288-基于FMC接口的JFM7K325T PCIeX4 3U VPX接口卡

基于FMC接口的JFM7K325T PCIeX4 3U VPX接口卡 一、板卡概述 标准VPX 3U板卡, 基于JFM7K325T 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIeX8、64bit DDR3容量2GByte,HPC的FMC连接器,板卡支持各种接口输入,软件支持windows,Linux驱动。可应用于高性能计算,频域算…

vue template 转 jsx 写法及TS类型应用

vue 的响应式数据 + jsx 开发体验简直不要太好,心智负担确实小,简直完爆 react(纯属个人暴论),不足的地方就是生态了,这点确实比不过 react。 本文更侧重于 TS 类型的写法,毕竟初次接触 vue jsx 时,实在对其 TS 类型声明很不顺手。要说 vue 模板语法哪些 API 不能在 js…

团队任务分配与高效执行应该如何做?从这些方面合理调配

本文聚焦团队任务分配与高效执行,深度剖析团队协作中任务分配不合理、沟通协作障碍、目标不明确、缺乏有效监督反馈等痛难点,阐述团队协作的必要性,进而给出合理分配任务、加强沟通协作等解决方法,还推荐了相关工具,为提升团队效能提供指引 。一、团队协作的痛难点 (一)…

2025.1.23

今天正式开始YOLOv8的相关学习。 YOLOv8的架构设计主要体现在以下几个方面:1. 改进的特征提取网络    YOLOv8在特征提取网络方面进行了显著改进,采用了更深、更宽的网络结构,以提高对复杂场景的处理能力。CSPNet(Cross Stage Partial Network):    CSPNet的引入有…

Android平台从上到下,无需ROOT/解锁/刷机,应用级拦截框架的最后一环,SVC系统调用拦截。

Android平台从上到下,无需ROOT/解锁/刷机,应用级拦截框架的最后一环,SVC系统调用拦截。Android平台从上到下,无需ROOT/解锁/刷机,应用级拦截框架的最后一环 —— SVC系统调用拦截。☞ Github: https://www.github.com/iofomo/abyss ☜ 由于我们虚拟化产品的需求,需要支持…

Seq 日志: .NET 应用程序中集成与快速入门

Seq 是一个功能强大且易于使用的日志服务器,特别适合用于集中管理和可视化 .NET 应用程序的日志。它支持结构化日志记录,提供实时查询和分析功能,帮助开发者快速定位和解决问题。 安装和配置 SeqWindows 部署: 可以从 Seq 下载页面:https://datalust.co/download 获取最新…

折腾笔记[11]-使用rust进行直接法视觉里程计估计

使用rust实现了一个完整的直接法视觉里程计系统,能够通过比较两幅图像中的像素强度来估计相机的运动。它通过单层和多层的优化策略,结合图像金字塔和并行计算,提高了位姿估计的精度和效率。最终,代码输出了优化后的相机位姿变换矩阵,并可视化了投影点的位置。摘要 使用rus…