news 2026/4/17 20:45:24

替 罪 羊

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
替 罪 羊

前言

代码

P3369 【模板】普通平衡树 - 洛谷

package class150; // 替罪羊树的实现(java版) // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加x,重复加入算多个词频 // 2,删除x,如果有多个,只删掉一个 // 3,查询x的排名,x的排名为,比x小的数的个数+1 // 4,查询数据中排名为x的数 // 5,查询x的前驱,x的前驱为,小于x的数中最大的数,不存在返回整数最小值 // 6,查询x的后继,x的后继为,大于x的数中最小的数,不存在返回整数最大值 // 所有操作的次数 <= 10^5 // -10^7 <= x <= +10^7 // 测试链接 : https://www.luogu.com.cn/problem/P3369 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer; import java.util.Arrays; public class Code02_ScapeGoat1 { // 平衡因子 public static double ALPHA = 0.7; // 空间的最大使用量 public static int MAXN = 100001; // 整棵树的头节点编号 public static int head = 0; // 空间使用计数 public static int cnt = 0; // 节点的key值 public static int[] key = new int[MAXN]; // 节点key的计数 public static int[] count = new int[MAXN]; // 左孩子 public static int[] left = new int[MAXN]; // 右孩子 public static int[] right = new int[MAXN]; // 数字总数 public static int[] size = new int[MAXN]; // 节点总数 public static int[] diff = new int[MAXN]; // 中序收集节点的数组 public static int[] collect = new int[MAXN]; // 中序收集节点的计数 public static int ci; // 最上方的不平衡节点 public static int top; // top的父节点 public static int father; // top是父节点的什么孩子,1代表左孩子,2代表右孩子 public static int side; public static int init(int num) { key[++cnt] = num; left[cnt] = right[cnt] = 0; count[cnt] = size[cnt] = diff[cnt] = 1; return cnt; } public static void up(int i) { size[i] = size[left[i]] + size[right[i]] + count[i]; diff[i] = diff[left[i]] + diff[right[i]] + (count[i] > 0 ? 1 : 0); } public static void inorder(int i) { if (i != 0) { inorder(left[i]); if (count[i] > 0) { collect[++ci] = i; } inorder(right[i]); } } public static int build(int l, int r) { if (l > r) { return 0; } int m = (l + r) / 2; int h = collect[m]; left[h] = build(l, m - 1); right[h] = build(m + 1, r); up(h); return h; } public static void rebuild() { if (top != 0) { ci = 0; inorder(top); if (ci > 0) { if (father == 0) { head = build(1, ci); } else if (side == 1) { left[father] = build(1, ci); } else { right[father] = build(1, ci); } } } } public static boolean balance(int i) { return ALPHA * diff[i] >= Math.max(diff[left[i]], diff[right[i]]); } public static void add(int i, int f, int s, int num) { if (i == 0) { if (f == 0) { head = init(num); } else if (s == 1) { left[f] = init(num); } else { right[f] = init(num); } } else { if (key[i] == num) { count[i]++; } else if (key[i] > num) { add(left[i], i, 1, num); } else { add(right[i], i, 2, num); } up(i); if (!balance(i)) { top = i; father = f; side = s; } } } public static void add(int num) { top = father = side = 0; add(head, 0, 0, num); rebuild(); } public static int small(int i, int num) { if (i == 0) { return 0; } if (key[i] >= num) { return small(left[i], num); } else { return size[left[i]] + count[i] + small(right[i], num); } } public static int rank(int num) { return small(head, num) + 1; } public static int index(int i, int x) { if (size[left[i]] >= x) { return index(left[i], x); } else if (size[left[i]] + count[i] < x) { return index(right[i], x - size[left[i]] - count[i]); } return key[i]; } public static int index(int x) { return index(head, x); } public static int pre(int num) { int kth = rank(num); if (kth == 1) { return Integer.MIN_VALUE; } else { return index(kth - 1); } } public static int post(int num) { int kth = rank(num + 1); if (kth == size[head] + 1) { return Integer.MAX_VALUE; } else { return index(kth); } } public static void remove(int i, int f, int s, int num) { if (key[i] == num) { count[i]--; } else if (key[i] > num) { remove(left[i], i, 1, num); } else { remove(right[i], i, 2, num); } up(i); if (!balance(i)) { top = i; father = f; side = s; } } public static void remove(int num) { if (rank(num) != rank(num + 1)) { top = father = side = 0; remove(head, 0, 0, num); rebuild(); } } public static void clear() { Arrays.fill(key, 1, cnt + 1, 0); Arrays.fill(count, 1, cnt + 1, 0); Arrays.fill(left, 1, cnt + 1, 0); Arrays.fill(right, 1, cnt + 1, 0); Arrays.fill(size, 1, cnt + 1, 0); Arrays.fill(diff, 1, cnt + 1, 0); cnt = 0; head = 0; } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); in.nextToken(); int n = (int) in.nval; for (int i = 1, op, x; i <= n; i++) { in.nextToken(); op = (int) in.nval; in.nextToken(); x = (int) in.nval; if (op == 1) { add(x); } else if (op == 2) { remove(x); } else if (op == 3) { out.println(rank(x)); } else if (op == 4) { out.println(index(x)); } else if (op == 5) { out.println(pre(x)); } else { out.println(post(x)); } } clear(); out.flush(); out.close(); br.close(); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 13:12:30

Dify平台数据导出功能评测:便于后续分析与审计

Dify平台数据导出功能评测&#xff1a;便于后续分析与审计 在企业级AI应用日益普及的今天&#xff0c;一个关键挑战逐渐浮现&#xff1a;我们如何确保这些“聪明”的系统是可理解、可追踪且合规运行的&#xff1f;当大语言模型&#xff08;LLM&#xff09;被嵌入客服机器人、智…

作者头像 李华
网站建设 2026/4/16 17:56:04

Dify在金融领域的应用尝试:自动化报告生成系统搭建

Dify在金融领域的应用尝试&#xff1a;自动化报告生成系统搭建 在金融机构&#xff0c;分析师们每天面对海量的财报、公告和市场数据&#xff0c;却仍需花费数小时撰写格式化的分析简报。这种高重复性、低创造性的工作不仅消耗人力&#xff0c;还容易因疲劳导致疏漏。当某上市公…

作者头像 李华
网站建设 2026/4/15 12:20:26

jscope使用教程:工业自动化中数据可视化的全面讲解

jscope实战指南&#xff1a;在工业自动化中实现高效数据可视化的秘诀当调试不再靠“猜”&#xff1a;从串口打印到波形可视化你有没有过这样的经历&#xff1f;电机控制调了三天 PID&#xff0c;系统还是震荡不止&#xff1b;电源模块莫名其妙重启&#xff0c;日志里只留下一行…

作者头像 李华
网站建设 2026/4/16 5:19:40

arm64和x64架构对比:移动设备与桌面计算的全面讲解

arm64与x64之争&#xff1a;从手机到超算&#xff0c;谁在定义未来计算的边界&#xff1f;你有没有想过&#xff0c;为什么你的iPhone能连续播放视频15小时不关机&#xff0c;而一台高性能游戏本插着电源都撑不过3小时&#xff1f;为什么苹果M1芯片能在无风扇的情况下跑完一整套…

作者头像 李华
网站建设 2026/4/17 22:56:21

AUTOSAR软件开发初学者指南:从ECU到软件组件

从零开始理解 AUTOSAR&#xff1a;一个汽车电子工程师的成长之路你有没有过这样的经历&#xff1f;刚接手一个ECU项目&#xff0c;打开代码仓库&#xff0c;满屏是Rte_Read_、Com_SendSignal这类函数调用&#xff0c;却不知道它们从哪来、往哪去&#xff1b;想改个信号处理逻辑…

作者头像 李华
网站建设 2026/4/13 23:34:58

Dify平台国际化支持现状与多语言处理能力评估

Dify平台国际化支持现状与多语言处理能力评估 在全球化数字服务加速推进的今天&#xff0c;企业不再满足于“将中文内容翻译成英文”这种粗放式的出海策略。用户期望的是真正理解其语言习惯、文化语境甚至地域合规要求的智能交互体验。这一趋势下&#xff0c;AI应用开发平台是否…

作者头像 李华