news 2026/4/17 15:43:18

整体二分——上

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
整体二分——上

题目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(); }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 2:04:06

计算机Java毕设实战-基于springboot高校奖助学金系统课程成绩、体育成绩、加分申请、综合成绩、奖学金申请【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/18 0:57:59

Redis 字符串类型完全指南:从原理到实战应用

引言 Redis作为高性能的键值存储数据库&#xff0c;其字符串&#xff08;String&#xff09;类型是最基础、最常用的数据结构。 本篇博客将深入探讨Redis字符串类型的底层原理、丰富命令集以及多种实际应用场景&#xff0c;帮助开发者全面掌握这一核心功能。 一、Redis字符串的…

作者头像 李华
网站建设 2026/4/18 1:36:09

【高可用架构必备技能】:掌握云原生Agent的Docker资源动态调度术

第一章&#xff1a;云原生Agent与Docker资源调度概述在现代分布式系统架构中&#xff0c;云原生Agent作为运行于容器环境中的核心组件&#xff0c;承担着监控、调度、服务发现和自愈等关键职责。这类Agent通常以轻量级进程形式部署在Docker容器中&#xff0c;依托容器化技术实现…

作者头像 李华
网站建设 2026/4/18 1:32:23

多人语音聊天室APP开发全解析:从技术架构到运营策略

一、技术架构设计1. 核心功能模块音频处理层&#xff1a;采用WebRTC技术实现实时音频采集与编码&#xff0c;支持OPUS/AAC等编码标准网络传输层&#xff1a;基于WebSocket/TCP-IP协议搭建通信框架&#xff0c;支持服务器中转和P2P混合模式业务逻辑层&#xff1a;用户角色体系&a…

作者头像 李华
网站建设 2026/4/18 1:31:07

人工智能大模型技术突破:引领智能时代新纪元

人工智能大模型技术突破&#xff1a;引领智能时代新纪元 【免费下载链接】Qwen3-30B-A3B-MLX-6bit 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3-30B-A3B-MLX-6bit 在当今数字化浪潮席卷全球的背景下&#xff0c;人工智能大模型技术正以惊人的速度重塑着我…

作者头像 李华
网站建设 2026/4/18 1:31:08

力扣hot100:路径总和III

题目描述&#xff1a;思路&#xff1a;本题和“和为k的子数组 有异曲同工之妙”&#xff0c;思路也相似。可以用一个哈希表去存储每条路径的和&#xff0c;两条路径和只差即为中间路径的和。可以用递归的方式向下遍历这颗树&#xff0c;定义一个s&#xff0c;表示目前路径的和&…

作者头像 李华