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

数据结构合集

ST表

区间最大值有一个很重要的性质,允许对于区间重复的操作,即 \(max(a,b,c)=max(max(a,b),max(b,c))\) 这是能用倍增非常关键的一点。例如,求区间和很显然不满足 \(a+b+c=(a+b)+(b+c)\) 也就不能用倍增的思想
\(st[i][j]\) 表示从 \(a_{i}\) 开始,向后 \(2^j\) 个元素中最大的元素。根据定义可得 \(st[i][0]=a[i]\),对于区间长度大于 \(1\) 的情况,发现可以每次从中间拆分成两个区间,递推着求,也就是: $$st[i][j]=max(st[i][j-1],\ st[i+(1\text{<<}(j-1))][j-1])$$考虑如何查询,由于对于区间可以重复操作,只需要把 \([l.r]\) 拆分成 \([l,l+2^k],\ [r-2^k+1,r]\) 两部分,其中 \(k=\log_{2}{(r-l+1)}\),即 \(max(st[l][k],\ st[r-(1\text{<<}k)+1][k])\)

void init(){lg2[1] = 0;for (int i = 2; i <= maxn - 1; ++i){lg2[i] = lg2[i / 2] + 1;}for (int i = 1; i <= n; ++i){st[i][0] = a[i];}
}
void build(){for (int len = 1; len <= lg2[n]; ++len){int k = (1 << len);for (int i = 1; i <= n - k + 1; ++i){st[i][len] = max(st[i][len - 1], st[i + (1 << (len - 1))][len - 1]);}}
}
int query(int l, int r){int k = lg2[r - l + 1];return max(st[l][k], st[r - (1 << k) + 1][k]);
}

分块

根号分治的思想,把长度为 \(n\) 的数组分成 \(\sqrt{n}\) 块,块长为 \(\sqrt{ n }\)。对于区间的查询,整块的部分用整块的信息,零碎的部分直接暴力求

最基本的单点修改和区间求和;单点修改直接修改,区间求和考虑三部分:

![[分块.png|300]]

左边和右边暴力求和,中间用整块的和即可,这样可以达到查询 \(\operatorname{O}(\sqrt{ n })\) 的时间复杂度

void build(){  blocksize = sqrt(n);  blockcnt = n / blocksize;  if (n % blocksize) blockcnt++;  for (int i = 1; i <= n; ++i){  belong[i] = (i - 1) / blocksize + 1;  }  for (int i = 1; i <= blockcnt; ++i){  blockl[i] = blocksize * (i - 1) + 1;  blockr[i] = min(blocksize * i, n);  }  for (int i = 1; i <= blockcnt; ++i){  for (int j = blockl[i]; j <= blockr[i]; ++j){  sum[i] += a[j];  }  }  
}  
void update(int x, int k){  a[x] += k;  sum[belong[x]] += k;  
}    
int query(int l, int r){  int ans = 0;  if (belong[l] == belong[r]){  for (int i = l; i <= r; ++i){  ans += a[i];  }  } else{  for (int i = l; i <= blockr[belong[l]]; ++i){  ans += a[i];  }  for (int i = blockl[belong[r]]; i <= r; ++i){  ans += a[i];  }  for (int i = belong[l] + 1; i <= belong[r] - 1; ++i){  ans += sum[i];  }  }  return ans;  
}

考虑如何区间修改;对于零散的部分仍然暴力修改,对于中间整块的部分,可以打上一个标记,意为这部分整体都要加上一个 \(tag\)

void build(){  blocksize = sqrt(n);  blockcnt = n / blocksize;  if (n % blocksize) blockcnt++;  for (int i = 1; i <= n; ++i){  belong[i] = (i - 1) / blocksize + 1;  }  for (int i = 1; i <= blockcnt; ++i){  blockl[i] = blocksize * (i - 1) + 1;  blockr[i] = min(n, blocksize * i);  }  for (int i = 1; i <= blockcnt; ++i){  for (int j = blockl[i]; j <= blockr[i]; ++j){  sum[i] += a[j];  }  }  
}  
void update(int l, int r, int k){  if (belong[l] == belong[r]){  for (int i = l; i <= r; ++i){  a[i] += k;  sum[belong[l]] += k;  }  } else{  for (int i = l; i <= blockr[belong[l]]; ++i){  a[i] += k;  sum[belong[l]] += k;  }  for (int i = blockl[belong[r]]; i <= r; ++i){  a[i] += k;  sum[belong[r]] += k;  }  for (int i = belong[l] + 1; i <= belong[r] - 1; ++i){  tag[i] += k;  }  }  
}  
int query(int l, int r){  int ans = 0;  if (belong[l] == belong[r]){  for (int i = l; i <= r; ++i){  ans += a[i] + tag[belong[i]];  }  } else{  for (int i = l; i <= blockr[belong[l]]; ++i){  ans += a[i] + tag[belong[i]];  }  for (int i = blockl[belong[r]]; i <= r; ++i){  ans += a[i] + tag[belong[i]];  }  for (int i = belong[l] + 1; i <= belong[r] - 1; ++i){  ans += sum[i] + tag[i] * (blockr[belong[i]] - blockl[belong[i]] + 1);  }  }  return ans;  
}
http://www.jsqmd.com/news/535620/

相关文章:

  • 如何快速掌握文件系统路由:vite-plugin-pages终极指南
  • 72小时恢复“自发货权限”,完整申诉思路!
  • 从Java全栈工程师视角看互联网大厂面试中的技术深度
  • Z-Image Atelier 安全部署指南:网络安全考量与内网穿透方案
  • 桌游玩家招募!全球首款 AI 主题桌游《Talk With》线下开玩丨北京 AI 原点社区 Party Nights 见!
  • 保姆级教程:用YOLOv5s在Windows上搞定印刷数字识别(从环境配置到摄像头实时检测)
  • MaxClaw 使用体验:MiniMax 这个云端 AI Agent 到底行不行?
  • G-Helper高效解决ROG游戏本色彩配置异常问题的一站式方案
  • 不用装软件!这款MicroPython浏览器 IDE :让你在手机上也能调试树莓派 Pico
  • 动态避障功能下的自动驾驶路径规划:从运动学到动力学模型到联合仿真实验的全套解决方案
  • SRS 4.0 WebRTC性能调优手册:如何提升一对一通话的流畅度与稳定性
  • 市面上的生发养发馆管用吗?黑奥秘全国超千店+真实案例见证效果 - 美业信息观察
  • 廊坊压力性白发变黑养发馆哪家好?黑奥秘权威荣誉,品质有保障 - 美业信息观察
  • Vue3 + TypeScript 大型项目状态管理:Pinia 类型安全最佳实践
  • Yuzu模拟器问题诊断与性能优化实用指南
  • Java全栈开发面试实战:从基础到微服务的全面考察
  • 魔塔html版修改代码
  • ncmdump:让NCM转MP3效率提升80%的开源解密工具
  • RAG 评估系统:如何用“打分机制”让智能问答越用越聪明?
  • 使用Gradio Chatbot组件构建高效AI对话界面的实战指南
  • Local SDXL-Turbo基础教程:Autodl资源监控告警设置(GPU>90%触发)
  • 如何彻底告别C盘爆红:Windows Cleaner终极系统优化实战指南
  • 从loss-epoch曲线诊断过拟合:训练集下降而验证集上升的深度解析
  • 谁才是律师的真帮手?五款主流法律AI实务深度横向测评报告
  • 基于Spring AI构建智能客服系统的架构设计与性能优化实战
  • 线控转向失效下的容错差动转向控制:保障车辆安全的关键技术
  • 一款基于 .NET 开源、跨平台应用程序自动升级组件
  • 3分钟快速上手:体验开源卡牌游戏的策略对决魅力
  • ssm+java2026年毕设蔬菜水果销售网站【源码+论文】
  • AI问答流式输出避坑指南:WebSocket连接管理与讯飞星火API的实战经验