科技——$O(n\log n)$ 三维偏序

问题背景

\(n\) 个三元组 \((a_i,b_i,c_i)\),要求满足 \(a_i\le a_j,b_i\le b_j,c_i\le c_j\) 的有序对 \((i,j)\) 数量。
保证不存在两个三元组相同。(存在相同的情况下面会说)。

介绍

因为不会出现重复的数,所以不需要考虑 \((i,j)\) 互相偏序的情况。

\(f_i\) 表示恰好 \(i\) 维偏序的对数,\(g_i\) 表示钦定 \(i\) 维偏序的对数。
那么 \(g_i=\sum_{j=i}^3 C_j^i \times f_j\),二项式反演得 \(f[i]=\sum_{j\ge i} (-1)^{j-i} \times C_j^i \times g_j\)
所以:\(f_0=g_0-g_1+g_2-g_3\)
\(g_3=g_0-f_0-g_1+g_2\)
\(g_3=f_3\),所以 \(f_3=g_0-f_0-g_1+g_2\)

\(g_0\)\(g_1\) 直接 \(O(1)\)\(O(n)\) 求,\(g_2\) 做三次二维偏序就可以了。

主要是 \(f_0\) 怎么算。
注意到现在偏序条件是 \(\le\) 所以 \(f_0\) 不一定 \(=f_3\)
比如 \((4,4,4)\) 确实三维偏序 \((2,4,4)\) 但是 \((2,4,4)\) 有两维是偏序 \((4,4,4)\) 的。

所以如果我们能让每一维都变成互不相同的就可以保证 \(f_0=f_3\) 了。
也就是说 \(f_3=\frac{g_0-g_1+g_2}{2}\)

那怎么办呢?
其实只需要分别按某一维为第一关键字排序,其他两维为二,三关键字排序。
将这种条件下的每个三元组的排名作为这一维新的值就可以了。
举个例子: 我们有三个三元组 \((4,4,2),(2,4,4),(4,4,4)\)

  1. 先按照第一维为第一关键字,二,三维为第二,三关键字排序:\((2,4,4),(4,4,2),(4,4,4)\)
    然后用现在的排名替换第一维:\((1,4,4),(2,4,2),(3,4,4)\)
  2. 再按照第二维为第一关键字,一,三维为第二,三关键字排序:\((1,4,4),(2,4,2),(3,4,4)\)
    然后用现在的排名替换第二维:\((1,1,4),(2,2,2),(3,3,4)\)
  3. 最后按照第三维为第一关键字,一,二维为第二,三关键字排序:\((2,2,2),(1,1,4),(3,3,4)\)
    然后用现在的排名替换第三维:\((2,2,1),(1,1,2),(3,3,3)\)

容易证明这样每一维都是排列,并且不会影响 \(f_3\) 最终的值。(但显然会影响 \(f_0,f_1,f_2\),反正你也不去管这三个值)。
具体看最后给出的代码。

代码可能比 CDQ 分治还好写。

补充说明

  1. 如果会出现相同的三元组怎么办?
    相同的三元组答案肯定一样,可以把他们缩到一起(类似于洛谷模板题的处理思路),然后在最后算答案的时候再加上互相偏序的三元组的贡献。

  2. 如果某一维要求 \(\ge\) 怎么办?
    把那一维全部取反即可。

局限性

  1. 不能像 CDQ 分治那样算出每个三元组具体偏序了多少其他三元组。

  2. 偏序条线必须包含 =,即不能处理 > 类型的偏序。
    这一点也很好证明,因为不管你的要求是什么,按照那种方法变换之后的序列都是一样的,无法区分 \(>\)\(\ge\)
    而如果你不变换的话,\((2,4,4)\) 没有一维是偏序 \((4,4,4)\) 的,但是 \((4,4,4)\) 并不是三维偏序 \((2,4,4)\) 的。
    所以 \(f_0\ne f_3\)


下面通过一道典题来给出代码。

例题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/908450.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware Aria Operations for Logs 8.18.3 新增功能简介

VMware Aria Operations for Logs 8.18.3 新增功能简介VMware Aria Operations for Logs 8.18.3 - 集中式日志管理 请访问原文链接:https://sysin.org/blog/vmware-aria-operations-for-logs/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org集中式日志管理 VMwa…

在 VS Code 中,一键安装 MCP Server!

大家好!我是韩老师。 本文是 MCP 系列文章的第三篇。之前的两篇文章是: Code Runner MCP Server,来了! 从零开始开发一个 MCP Server!经过之前两篇文章的介绍,相信不少童鞋已经用上甚至开发起了第一个 MCP Server。 不过呢,还是遇到一些童鞋在安装/配置 MCP Server 的时…

读DAMA数据管理知识体系指南36元数据管理概念(上)

读DAMA数据管理知识体系指南36元数据管理概念(上)1. 业务驱动因素 1.1. 可靠且良好管理元数据有助于1.1.1. 通过提供上下文语境和执行数据质量检查提高数据的可信度1.1.2. 通过扩展用途增加战略信息(如主数据)的价值1.1.3. 通过识别冗余数据和流程提高运营效率1.1.4. 防止使…

AMD CDNA介绍(上)

AMD CDNA介绍 AMD CDNA处理器采用并行微架构,旨在为通用数据并行应用提供一个出色的平台。需要高带宽或计算密集型的数据密集型应用程序,这是在AMD CDNA处理器上运行的候选者。 AMD CDNA生成系列处理器的框图,如图5-10所示。图5-10 AMD CDNA生成系列处理器的框图 CDNA设备包…

AMD Instinct™MI300系列微架构杂谈

AMD Instinct™MI300系列微架构 AMD Instinct MI300系列加速器基于AMD CDNA 3架构,旨在为HPC、人工智能(AI)和机器学习(ML)工作负载提供领先性能。AMD Instinct MI300系列加速器非常适合极端的可扩展性和计算性能,可以在单个服务器到世界上最大的EB级超级计算机的所有设备…

在Eager模式下对Llama 2 7B模型进行性能评估技术

在Eager模式下对Llama 2 7B模型进行性能评估 指定--compile none以使用Eager模式。 1)--compile:设置为none以使用Eager模式 2)--profile:启用torch.profiler的跟踪功能 3)--checkpoint_path:检查点路径 4)--prompt:输入提示 5)--max_new_tokens:最大新的token数 6)…

使用 torch.compile 加速视觉Transformer

使用 torch.compile 加速视觉Transformer视觉Transformer(ViT)是一个类似 BERT的transformer编码器模型,在大规模的图像集合上,使用有监督方式进行了预训练,就是在分辨率为 224224 像素的 ImageNet-21k 数据集上预训练的。以下是如何使用这个模型将 COCO 2017 数据集中的一…

推荐技术书《AI芯片开发核心技术详解》(1)、《智能汽车传感器:原理设计应用》(2)、《TVM编译器原理与实践》(3)、《LLVM编译器原理与实践》(4),谢谢

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…

GPU到GPU通信选项技术

GPU到GPU通信选项技术将讨论使用AMD Instinct™MI250和AMD InstinctTM MI250X GPU的系统中的GPU到GPU通信选项。每个MI250(X)GPU由两个图形计算芯片(GCD)组成。如图4-20所示,显示了具有4个MI250 GPU(8个GCD)的节点的示意图。每个绿色框代表一个MI250 GPU和两个GCD。GCD通…

visual stdio 使用CMake

基础知识 工具>选项>CMake>常规 选中从不使用CMake预设重启 visual stdio,点击打开本地文件夹(F),打开CMakeList.txt根目录此时会在CMake根目录自动生成CMakeSettings.json文件,使用visual stdio文件打开CMakeSettings.json如果打开时,是json文件时,可以右键CMa…

mysql InnoDB的事务

一、事务的概念 一组数据库操作要么全部成功,要么全部失败,目的是为了保证数据的最终一致性 二、事务的四大特性(ACID)原子性(Actomicity):当前事务的操作要么成功,要么失败,原子性是由undo log日志来保证 一致性(Consistency):使用事务的最终目的,由业务代码正确…

如何使用 OpenAI Agents SDK 构建 MCP

1.概述 OpenAI Agents SDK 现已支持 MCP(模型上下文协议),这是 AI 互操作性的重大变革。这使开发人员能够高效地将 AI 模型连接到外部工具和数据源。本篇博客,笔者将指导使用 OpenAI Agents SDK 构建 MCP 服务器,以增强你的 AI 应用程序。 2.内容 2.1 什么是 MCP MCP 服务…