线段树(进阶?)

发布时间:2026/8/11 2:58:05

线段树(进阶?)
线段树动态开点适用于数列长度n很大,但是操作次数有限的情况,而且动态开点所占用的内存更少,开2*n就够// root 表示整棵线段树的根结点cnt 表示当前结点个数 int n, cnt, root; int sum[n * 2], ls[n * 2], rs[n * 2]; //int sz[n*2],lazy[n*2] ////---------------修改节点(单点修改/新建结点/区间修改(这个加一个参数y,修改[x,y]区间))------------------- // 用法update(root, 1, n, x, f); 其中 x 为待修改节点的编号 void update(int p, int s, int t, int x, int f) { // 引用传参 if (!p) p cnt; // 当结点为空时创建一个新的结点 if (s t) { sum[p] f; return; } int m s ((t - s) 1); if (x m) update(ls[p], s, m, x, f); else update(rs[p], m 1, t, x, f); sum[p] sum[ls[p]] sum[rs[p]]; // pushup } ////--------------------------区间查询---------------------- // 用法query(root, 1, n, l, r); int query(int p, int s, int t, int l, int r) { if (!p) return 0; // 如果结点为空返回 0 if (s l t r) return sum[p]; int m s ((t - s) 1), ans 0; if (l m) ans query(ls[p], s, m, l, r); if (r m) ans query(rs[p], m 1, t, l, r); return ans; } ////区间修改也是一样的 ////不过下放标记时要注意如果缺少孩子就直接创建一个新的孩子或者使用标记永久化技巧 ////标记永久化---------------可以直接套到下面的题里---不用pushback和pushup void update(int x,int l,int r,int ql,int qr,int k){ if(!x)xidx; a[x](min(r,qr)-max(l,ql)1)*k; if(qllrqr){ z[x]k;return; } int mid(lr)1; if(qlmid)update(lc[x],l,mid,ql,qr,k); if(qrmid)update(rc[x],mid1,r,ql,qr,k); } int query(int x,int l,int r,int ql,int qr,int mk){ if(qllrqr)return a[x](r-l1)*mk; int mid(lr)1,ans0; if(qlmid)ansquery(lc[x],l,mid,ql,qr,mkz[x]); if(qrmid)ansquery(rc[x],mid1,r,ql,qr,mkz[x]); return ans; } ////下面的代码是缺少孩子则创建 ///////////////////////// //https://www.luogu.com.cn/problem/P13825 //题目概要:长度为n的序列,第i位初值为i,对区间修改,求区间和 //操作次数:1e5 //n的大小 1e9 #include bits/stdc.h using namespace std; #define ll unsigned long long const ll inf 0x3f3f3f3f; const ll N 6e6 10; const ll mod 1e9 7; ll n, m, root; ll sum[N], lc[N], rc[N], cnt, lazy[N]; void pushup(ll p) { sum[p] sum[lc[p]] sum[rc[p]]; } void pushdown(ll p, ll l, ll r, ll mid) { if (lazy[p]) { //不过下放标记时要注意如果缺少孩子就直接创建一个新的孩子 if (!lc[p])lc[p] cnt; if (!rc[p])rc[p] cnt; lazy[lc[p]] lazy[p]; lazy[rc[p]] lazy[p]; sum[lc[p]] (mid - l 1) * lazy[p]; sum[rc[p]] (r - mid) * lazy[p]; lazy[p] 0; } } ////------------------ void update(ll p, ll s, ll t, ll l, ll r, ll f) { if (p 0) { p cnt; } if (s l t r) { sum[p] (t - s 1) * f; lazy[p] f; return; } ll mid s ((t - s) 1); pushdown(p, s, t, mid); if (l mid)update(lc[p], s, mid, l, r, f); if (r mid)update(rc[p], mid 1, t, l, r, f); pushup(p); } //查询 ll ask(ll p, ll s, ll t, ll l, ll r) { //if (p 0)return 0; if (s l t r) { return sum[p]; } ll mid s ((t - s) 1); pushdown(p, s, t, mid); ll res 0; if (l mid)res ask(lc[p], s, mid, l, r); if (r mid)res ask(rc[p], mid 1, t, l, r); return res; } void solve() { cin n m; // for (int i 1; i n; i) { // update(root, 1, n, i, i, i); // } while (m--) { ll opt; cin opt; if (opt 1) { ll x, y, k; cin x y k; update(root, 1, n, x, y, k); } else { ll x, y; cin x y; ll res ask(root, 1, n, x, y); res (x y) * (y - x 1) / 2; cout res \n; } } } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t 1; //cin t; while (t--) { solve(); } return 0; }线段树优化建图#include bits/stdc.h using namespace std; #define ll long long const ll inf 0x3f3f3f3f3f3f3f; const ll N 2e5 10; const ll mod 1e9 7; //一个点向一段连续的区间中的点连边--:入树 // 一个连续的区间向一个点连边--:出树 /*https://codeforces.com/problemset/problem/786/B 题目大意有 n 个点、q 次操作。每一种操作为以下三种类型中的一种 - 操作一连一条 u → v 的有向边权值为 w。 - 操作二对于所有 i ∈ [l,r] 连一条 u → i 的有向边权值为 w。 - 操作三对于所有 i ∈ [l,r] 连一条 i → u 的有向边权值为 w。 求从点 s 到其他点的最短路。 1 ≤ n, q ≤ 10^5, 1 ≤ w ≤ 10^9.*/ /*这段话是我在看了题解后写的(如果不对的话我会修改) 对于点和点的遍很好操作 对于点到区间:如果让点和区间内的每一个点都练一条边,会TLE,于是使用线段树优化. 首先,对于线段树中的每一个大区间会有两个子区间,则设定大区间到子区间的代价为0(这里是单向的路径) 点只需要连接到指定的区间内,就可以到达区间,但是这样只能到达线段树的叶子节点 为了从线段树回到图,应该再对每一个叶子节点,都连接一条到达图中他所对应区间的顶点 eg叶子节点区间[l,l1)-点l --这里也是单向边 如此,就能够使用logn的复杂度建好一个点到区间的边 对于区间到点,同理,建一个出树(上面那个叫入树) 建完图之后跑dj就行 */ struct node { ll v, w; bool operator(const node x)const { return w x.w; } }; vectornodee[N 3]; vectorllls(N 3), rs(N 3); vectorlldst(N 3, inf), vis(N 3, false); ll cnt, n, q, s; //建立入树 void build_in(ll p, ll l, ll r) { if (!p)p cnt;//动态开点 if (l r) { //叶子节点,节点编号:p,区间[l,l1) //建立p-l的单向路径,w为0 e[p].push_back({ l,0 }); return; } ll mid l r 1; build_in(ls[p], l, mid); build_in(rs[p], mid 1, r); //建立大区间到子区间的单向路径 e[p].push_back({ ls[p],0 }); e[p].push_back({ rs[p],0 }); } //建立出树 void build_out(ll p, ll l, ll r) { if (!p)p cnt;//动态开点 if (l r) { //叶子节点,节点编号:p,区间[l,l1) //建立l-p的单向路径,w为0 e[l].push_back({ p,0 }); return; } ll mid l r 1; build_out(ls[p], l, mid); build_out(rs[p], mid 1, r); //建立子区间到大区间的单向路径 e[ls[p]].push_back({ p,0 }); e[rs[p]].push_back({ p,0 }); } //将入树和图之间建边,pos-[ql,qr] //p是当前结点编号,l,r是入树结点的左右端点 //ql,qr,是需要建边的区间端点,pos是要建边的端点 //--我直接在函数内建立边 void add_in(ll p, ll l, ll r, ll ql, ll qr, ll pos, ll w) { if (l ql r qr) { e[pos].push_back({ p,w }); return; } ll mid l r 1; if (ql mid)add_in(ls[p], l, mid, ql, qr, pos, w); if (qr mid)add_in(rs[p], mid 1, r, ql, qr, pos, w); } //将出树和图之间建边,[ql,qr]-pos void add_out(ll p, ll l, ll r, ll ql, ll qr, ll pos, ll w) { if (l ql r qr) { e[p].push_back({ pos,w }); return; } ll mid l r 1; if (ql mid)add_out(ls[p], l, mid, ql, qr, pos, w); if (qr mid)add_out(rs[p], mid 1, r, ql, qr, pos, w); } //DJ void dj() { dst[s] 0; priority_queuenodepq; pq.push({ s,dst[s] }); while (!pq.empty()) { node tmp pq.top(); pq.pop(); ll u tmp.v; ll W tmp.w; if (vis[u])continue; vis[u] true; for (const auto re : e[u]) { ll v re.v; ll w re.w; if (vis[v] || dst[v] W w)continue; dst[v] W w; pq.push({ v,dst[v] }); } } } void solve() { cin n q s; cnt n;//因为前n个点是常规点,所以线段树要从n1开始开点 ll root_in 0, root_out 0; //建立入树 build_in(root_in, 1, n); //建立出树 build_out(root_out, 1, n); while (q--) { ll opt; cin opt; if (opt 1) { ll u, v, w;//我喜欢写u-v cin u v w; e[u].push_back({ v,w }); } if (opt 2) { ll u, l, r, w; cin u l r w; add_in(root_in, 1, n, l, r, u, w); } if (opt 3) { ll v, l, r, w; cin v l r w; add_out(root_out, 1, n, l, r, v, w); } } dj(); for (int i 1; i n; i) { if (dst[i] inf)cout -1 ; else cout dst[i] ; } } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t 1; //cin t; while (t--) { solve(); } return 0; }

相关新闻

【2027最新】基于SpringBoot+Vue的语言在线考试与学习交流网页平台管理系统源码+MyBatis+MySQL

【2027最新】基于SpringBoot+Vue的语言在线考试与学习交流网页平台管理系统源码+MyBatis+MySQL

2026/8/11 2:48:05

博主介绍:✨ 专业背景 专注Java企业级开发与小程序生态,全网影响力10万开发者,CSDN特邀作者、技术专家、新星计划导师。 🎯 核心服务 📚 毕业设计智库 微信小程序方向:100个前沿选题 Java企业级方向&#x…

电赛ACAC变换电路并联运行:功率扩容与均流控制实战指南

电赛ACAC变换电路并联运行:功率扩容与均流控制实战指南

2026/8/11 2:48:04

1. 先搞清楚ACAC并联到底要解决什么,以及为什么电赛会考这个如果你正在准备电赛,尤其是电源方向的题目,看到“ACAC变换电路并联运行”这个标题,第一反应可能是:这听起来像是一个复杂的电力电子系统设计。没错&#xff…

SpringBoot+Vue在线考试系统:从环境搭建到二次开发的完整实战指南

SpringBoot+Vue在线考试系统:从环境搭建到二次开发的完整实战指南

2026/8/11 2:48:04

1. 先搞清楚这个项目能帮你解决什么实际问题 如果你正在找Java Web方向的毕业设计、课程设计,或者想给简历增加一个有分量的实战项目,这个“SpringBoot在线考试管理系统”是个非常典型的选择。它不是一个简单的增删改查(CRUD)演示…

绕过TPM与CPU限制:老电脑无损升级Windows 11实战指南

绕过TPM与CPU限制:老电脑无损升级Windows 11实战指南

2026/8/11 4:08:08

1. 项目概述:一次“非官方”的Windows 11升级实战手里这台戴尔XPS 15 9550,当年也是旗舰级别的创作本,i7-6700HQ的CPU,16G内存,用起来其实还挺顺手的。但自从Windows 11发布,看着那个全新的UI和宣称的安全性…

PowerShell变量详解:从基础到高级应用

PowerShell变量详解:从基础到高级应用

2026/8/11 4:08:08

1. PowerShell变量基础解析在Windows自动化管理和系统运维领域,PowerShell变量是最基础却最容易被低估的组件。与传统的CMD环境变量不同,PowerShell变量本质上都是.NET对象,这个特性赋予了它远超普通脚本语言的灵活性和强大功能。变量声明语法…

腾讯云微搭低代码实战:两周构建微信小程序代备案网站

腾讯云微搭低代码实战:两周构建微信小程序代备案网站

2026/8/11 4:08:08

1. 项目缘起:一个“代备案”需求的诞生去年年底,我接到了一个朋友公司的需求,他们是一家为中小微企业提供一站式工商财税服务的公司。随着微信小程序生态的繁荣,他们的客户群体——那些开餐馆、做零售、搞培训的老板们&#xff0c…

C++网络编程入门:TCP通信核心流程与基础函数详解

C++网络编程入门:TCP通信核心流程与基础函数详解

2026/8/11 4:08:08

1. 从“黑盒”到“白盒”:理解TCP网络通信的本质 很多刚接触C网络编程的朋友,上来就想写个聊天室或者游戏服务器,结果照着网上的代码敲完,编译通过,一运行,要么连不上,要么收不到数据&#xff0…

Python音频剪辑工具HzChopGUI:本地化GUI实现与批量处理实践

Python音频剪辑工具HzChopGUI:本地化GUI实现与批量处理实践

2026/8/11 4:08:08

这次我们来看一个名为“HzChopGUI_Python ver”的项目。从标题可以明确,这是一个基于Python开发的图形界面工具,主要用于音频处理,核心功能是“砍音”,即音频的切割、剪辑或频率处理。项目作者预告了后续的C版本,但当前…

学了那么多,为什么业绩就是不见涨?

学了那么多,为什么业绩就是不见涨?

2026/8/11 3:58:08

这大概是很多老板心里最扎心的问题。课没少听,笔记没少记,各种管理理论张口就来。可一年到头算算账,销售额还是那个数字,利润还是那个水平。你开始怀疑:是不是学习本身没用?是不是我的行业不行了&#xff1…

比较好的亚太EMBA,问了6位校友师资差别真的挺大

比较好的亚太EMBA,问了6位校友师资差别真的挺大

2026/8/10 5:58:32

比较好的亚太EMBA核心差异先看什么?对于希望兼顾工作与系统管理能力提升的亚太区高管而言,筛选匹配度高的EMBA项目时,师资配置是决定学习体验与实际收获的核心要素之一。我们结合3-4个公开信息透明、办学历史较长的亚太区主流EMBA项目特点&am…

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

2026/8/10 7:54:12

备考海外游学的亚洲EMBA面试,核心要围绕项目国际化设计逻辑、个人跨文化管理经验匹配度两个维度准备,避免把游学模块等同于普通旅游参访的认知偏差。不少备考者花3个月对比6份资料,却容易忽略面试官对“国际视野落地能力”的考察——比如香港…

比较好的国内EMBA,问了二十位校友聊透人脉价值

比较好的国内EMBA,问了二十位校友聊透人脉价值

2026/8/10 7:19:21

比较好的国内EMBA核心差异体现在哪些方面?比较好的国内EMBA的核心长期价值,很大程度上依托于校友网络的连接质量与资源生态的活跃度,这也是不少高管在择校时优先考量的因素。我们结合3-4个市场关注度较高的项目公开信息,从课程、师…

Unity新手入门:从零搭建开发环境与核心概念解析

Unity新手入门:从零搭建开发环境与核心概念解析

2026/8/11 0:07:41

1. 项目概述:为什么Unity是游戏开发者的首选起点如果你对游戏开发感兴趣,或者想进入这个充满创造力的行业,那么“Unity”这个名字你肯定不陌生。它几乎是所有新手开发者、独立游戏团队,甚至是一些3A大厂在特定项目上的首选引擎。为…

Agency-Agents 智能体系统从零搭建实战指南

Agency-Agents 智能体系统从零搭建实战指南

2026/8/11 0:07:41

在开发复杂应用时,我们常常遇到单一模型难以兼顾全局规划与细节执行的困境。有时候,模型擅长创意生成却在逻辑推理上稍显吃力,或者精于代码编写却缺乏对业务上下文的深刻理解。为了解决这个问题,多智能体协作架构应运而生&#xf…

MiniMax 权益码 Token Plan 套餐 9 折优惠,Token Plan 共建邀请计划 至2026.8.31

MiniMax 权益码 Token Plan 套餐 9 折优惠,Token Plan 共建邀请计划 至2026.8.31

2026/8/11 0:07:41

🚀 MiniMax Token Plan MiniMax 推出全新 Token 计划,新增语音、音乐、视频和图片生成权益。 用户邀请好友可享双重福利 订阅一份套餐,解锁最新模型 —— 前沿 Coding 能力、1M 超长上下文、原生多模态,图文音视频共用套餐额度。 …

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/8 5:07:31

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/9 13:42:46

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/8 2:30:15

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…