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

整体二分——上

题目1

P3834 【模板】可持久化线段树 2 - 洛谷

// 区间内第k小,第一种写法,java版 // 给定一个长度为n的数组,接下来有m条查询,格式如下 // 查询 l r k : 打印[l..r]范围内第k小的值 // 1 <= n、m <= 2 * 10^5 // 1 <= 数组中的数字 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3834 // 本题是讲解157,可持久化线段树模版题,现在作为整体二分的模版题 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.Arrays; public class Code01_RangeKth1 { public static int MAXN = 200001; public static int n, m; // 位置i,数值v public static int[][] arr = new int[MAXN][2]; // 查询 public static int[] qid = new int[MAXN]; public static int[] l = new int[MAXN]; public static int[] r = new int[MAXN]; public static int[] k = new int[MAXN]; // 树状数组 public static int[] tree = new int[MAXN]; // 整体二分 public static int[] lset = new int[MAXN]; public static int[] rset = new int[MAXN]; // 查询的答案 public static int[] ans = new int[MAXN]; // 树状数组中的lowbit public static int lowbit(int i) { return i & -i; } // 树状数组中增加i位置的词频 public static void add(int i, int v) { while (i <= n) { tree[i] += v; i += lowbit(i); } } // 树状数组中查询[1~i]范围的词频累加和 public static int sum(int i) { int ret = 0; while (i > 0) { ret += tree[i]; i -= lowbit(i); } return ret; } // 树状数组中查询[l~r]范围的词频累加和 public static int query(int l, int r) { return sum(r) - sum(l - 1); } // 整体二分的第一种写法 // 问题范围[ql..qr],答案范围[vl..vr],答案范围的每个下标都是数字的排名 public static void compute(int ql, int qr, int vl, int vr) { if (ql > qr) { return; } if (vl == vr) { for (int i = ql; i <= qr; i++) { ans[qid[i]] = arr[vl][1]; } } else { // 修改数据状况 int mid = (vl + vr) / 2; for (int i = vl; i <= mid; i++) { add(arr[i][0], 1); } // 检查每个问题并划分左右 int lsiz = 0, rsiz = 0; for (int i = ql; i <= qr; i++) { int id = qid[i]; int satisfy = query(l[id], r[id]); if (satisfy >= k[id]) { lset[++lsiz] = id; } else { k[id] -= satisfy; rset[++rsiz] = id; } } for (int i = 1; i <= lsiz; i++) { qid[ql + i - 1] = lset[i]; } for (int i = 1; i <= rsiz; i++) { qid[ql + lsiz + i - 1] = rset[i]; } // 撤回数据状况 for (int i = vl; i <= mid; i++) { add(arr[i][0], -1); } // 左右两侧各自递归 compute(ql, ql + lsiz - 1, vl, mid); compute(ql + lsiz, qr, mid + 1, vr); } } public static void main(String[] args) throws Exception { FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); n = in.nextInt(); m = in.nextInt(); for (int i = 1; i <= n; i++) { arr[i][0] = i; arr[i][1] = in.nextInt(); } for (int i = 1; i <= m; i++) { qid[i] = i; l[i] = in.nextInt(); r[i] = in.nextInt(); k[i] = in.nextInt(); } Arrays.sort(arr, 1, n + 1, (a, b) -> a[1] - b[1]); compute(1, m, 1, n); for (int i = 1; i <= m; i++) { out.println(ans[i]); } out.flush(); out.close(); }
http://www.rkmt.cn/news/84481.html

相关文章:

  • ABAP内表汇总数据的方法汇总
  • 口碑好的质量流量计供应商
  • Python高效实现Excel与TXT文本文件数据转换指南
  • 在数字画布上建立学习秩序:四川涂色教育科技有限公司的插画教学体系
  • 终极指南:如何用Universal x86 Tuning Utility释放Intel CPU电压调节潜力
  • Keye-VL-1.5:重新定义多模态视频理解的技术突破
  • 飞牛fnOS使用DNS验证方式,用acme自动签发SSL证书
  • 【API 设计之道】03 非标行为设计:当 REST 无法描述“取消订单”时怎么办?
  • 从零构建PHP扩展:基于Rust的高性能模块开发实战(完整源码级教程)
  • 2025 年 12 月苏作红木家具权威推荐榜:匠心传承与东方美学典范之选 - 品牌企业推荐师(官方)
  • 2025年PVC地板厂家权威推荐榜:导电/防静电/同质透心/复合/商用/磁性/自沉式,专业解析各品类核心优势与选购指南 - 品牌企业推荐师(官方)
  • 算力新标杆:昇腾Atlas 800T NPU实战Llama-2-7b全流程评测与技术解析
  • 联想Battery report准确吗,会显示错误吗
  • Wan2.2-T2V-A14B支持生成投票互动选项吗?短视频营销转化路径设计
  • 千亿参数落地革命:GLM-4.5V-FP8如何助力中小企业AI部署
  • 2025年12月AI培训与GEO服务商权威推荐榜:数字人、智能体、企业获客与短视频营销解决方案深度解析 - 品牌企业推荐师(官方)
  • 多人语音聊天室APP开发全解析:从技术架构到运营策略
  • 合并两个有序链表:双指针迭代法实现(C++)
  • Wan2.2-T2V-A14B已接入某头部视频平台AI剪辑工具链
  • 基于 openFuyao 的 AI 推理加速实战:智能路由与 PD 分离式 KVCache 架构揭秘
  • 2025 年 QMS 质量管理软件权威推荐榜:智能工厂与精益制造必备的数字化管控利器 - 品牌企业推荐师(官方)
  • 人工智能大模型技术突破:引领智能时代新纪元
  • 2025 年建筑加固技术权威推荐榜:碳纤维加固、粘钢加固等创新工艺深度解析与优质服务商精选 - 品牌企业推荐师(官方)
  • CVPR 2025最佳论文突破:DepthCrafter实现开放世界视频深度序列生成新范式
  • 突破跨模态生成瓶颈:Step-Video-TI2V开创图生视频技术新范式
  • 地平线苏治中:开源框架和基础模型赋能具身智能行业
  • 54、深入探索Shell编程:命令、变量与模式匹配的综合指南
  • Wan2.2-T2V-A14B在综艺节目花絮自动生成中的尝试
  • 51单片机:了解最小核心系统
  • 【VSCode量子编程环境搭建指南】:手把手教你5步配置Qiskit开发环境