首页 > 其他分享 >找到排列中的 1

找到排列中的 1

时间:2024-07-30 14:41:24浏览次数:6  
标签:排列 找到 dfrac 复杂度 right Algo 询问 left

题目大意

评测机保存一个秘密的 \(1\sim n\) 的排列 \(a\),允许你进行两种询问:

  1. 询问 \(i,j,k\),评测机告诉你是否有 \(k\mid(a_i-a_j)\)
  2. 询问 \(i,j\),评测机告诉你是否有 \(a_i<a_j\)

其中,询问 \(2\) 最多进行一次,询问 \(1\) 可以进行任意次,但是不能超时。

你需要确定 \(1\) 在排列中的位置,即找到 \(i\),使 \(p_i=1\)。

时间限制 \(2s\),\(n\le 10^6\)。

Algo 1

考虑暴力,\(O(n^2)\) 询问排列中任意两个不同位置,显然只有询问到 \(1,n\) 时差值能被 \(n-1\) 整除。

进行一次询问 \(2\) 确定大小即可。

Algo 2

\(\text{Algo 1}\) 提供了一种思路,即,如果我们知道一组数的最大值最小值的差,我们可以 \(O(n^2)\) 的询问最大值和最小值,不能确定顺序。

考虑对原序列进行分治,我们可以通过询问每个位置与位置 \(1\) 的差是否被 \(2\) 整除将原序列分成两组。每组中任意两数的差可以被 \(2\) 整除,但不一定被 \(4\) 整除。

如果 \(n\) 为奇数,那么两组数有一组较多,这一组一定均为奇数,\(1\) 和 \(n\) 一定都在这一组,我们可以递归做下去。

一种处理方法是定义一个阈值 \(S\),递归到大小为 \(S\) 的时候暴力查出区间最大最小,保存到另一个数组,最后在这个数组暴力查最大最小。

递归的复杂度是 \(O(n\log n)\) 的,可以忽略不计,最终将取得 \(O\left(\dfrac{n}{S}\right)\) 块,每块长 \(O(S)\),总的暴力复杂度是 \(O(nS)\) 的。

由于每个块会向数组加入 \(O(1)\) 个数据,最终数组的长度是 \(O\left(\dfrac{n}{S}\right)\) 的,暴力复杂度 \(O\left(\dfrac{n^2}{S^2}\right)\)。

总复杂度 \(O\left(\dfrac{n^2}{S^2}+nS\right)\),由均值不等式,取 \(S=\sqrt[3]{n}\) 时复杂度最优,此时复杂度为 \(O(n^{4/3})\)。

Algo 3

上面那个做法略笨,因为我们不必将合并留到最后,如果在递归回溯过程中合并,单次计算是 \(O(1)\) 的,最终复杂度 \(O(n\log n)\)

Algo 4

最开始可以随意选一个数,\(O(n\log n)\) 二分和这个数差最大的数,显然这个数非 \(1\) 即 \(n\),\(O(n)\) 扫一遍与这个数差 \(n-1\) 的数即可。

标签:排列,找到,dfrac,复杂度,right,Algo,询问,left
From: https://www.cnblogs.com/weily09/p/18332176

相关文章

  • 如何修复我的 Python Azure Function DevOps Pipeline 上的“找到 1 个函数(自定义)加载
    我正在尝试使用AzureDevOps构建管道将PythonAzureFunction部署到Azure门户。由于某种原因,代码被部署到服务器,但我在尝试访问端点时收到404错误。我收到一个错误,显示1functionsfound(Custom)0functionsloaded,以及在服务器上显示ModuleNotFound......
  • 在工作线程中找到基于 Celery 类的任务,但在使用时得到 NotRegistered
    我像那样配置CeleryfromceleryimportCeleryfromsettings.configimportsettingscelery_app=Celery(broker=settings.RABBITMQ_URL,backend="rpc://",)celery_app.config_from_object(settings.CELERY_SETTINGS_MODULE)celery_app.autodiscov......
  • 找到一种方法将program1的输出作为python中program2的输入发送
    有人可以帮我找到一种方法将program1的输出作为python中的program2的输入发送将其保存为.csv文件不会对我有帮助,因为该程序应该尽快执行这些任务。因此我正在寻找一种方法将程序1的终端输出直接发送到程序2在Python中,可以使用子进程模块将一个程序的输出发送到另一个程......
  • 有效地找到大图的近似最小生成树
    我有大量节点,大约25000个,每个节点都有3D位置。我想生成一个稀疏连接的图,其边由节点之间的距离给出,以在GNN中使用。查找算法最小生成树(MST)通常依赖于首先从完全连接的图开始,然后删除节点以找到MST。对于大型图来说,这非常慢。为了尝试加快速度,我尝试使用sc......
  • 如何找到可以包围多边形的最小圆?
    使用python,如何找到可以包围多边形的最小圆?多边形被定义为映射2D平面内顶点的一组坐标。要求:输入|||:表示多边形顶点坐标的元组列表。例如:[(x1,y1),(x2,y2),...,(xn,yn)].输出:包含最小外接圆圆心及其坐标的元组半径。例如:((x_center,......
  • 高效研发工时管理:找到完美系统的秘诀
    国内外主流的10款研发工时管理系统对比:PingCode、Worktile、无鱼项目工时系统、TogglTrack、泽众ALM、Asana、Jira、GitHub、Trello、TrackingTime。在研发团队中,工时管理常常成为效率瓶颈,尤其是在资源分配和项目进度跟踪方面。选择合适的研发工时管理系统可以大大提升项目管......
  • P5825 排列计数 加强版
    加强版和原题不同之处在于\(p\)不再是一个排列,而是一个普通的值域为\([1,n]\)的数组考虑将\([p_i<p_{i+1}]\)转化为\(1-[p_i\gep_{i+1}]\),方便计算后面的\(g\),也就是恰好\(n-k-1\)不上升点的方案数记一段不上升点的连续段为非升段,\(f_i\)表示恰好\(i\)个不上升......
  • 反转函数以获得给定排列的字典索引
    我正在处理一个Python3代码挑战,其中消息根据52张标准扑克牌的洗牌顺序进行编码或解码。我已经找到了如何对消息进行编码,但我很难反转该函数以从给定的洗牌顺序中获取消息。我有一个函数可以根据索引查找卡片列表的字典排列。我现在需要一个从卡片列表中进行排列并输出其索引......
  • Vcpkg + cmake + pybind 问题“无法找到平台独立库 <前缀>”
    我发现了vcpkgerlier,它看起来很有趣,但是易于使用。据我了解,经过一天的调查,vcpkgpybind11与vcpkgpython搭配使用。但是当我启动一个简单的程序时,它被中止并出现以下输出无法找到平台独立库<前缀>这是一个已知问题,但不适用于vcpkgpython。我不知道为什么?不......
  • 比较列表中的标题并找到相似的标题
    我编写了一个Python代码,该代码接收产品标题作为输入,并从演示文稿中查找类似的标题。一切都运行良好,但它错误地识别了一些标题。我认为它错误地识别了带有数字的标题说明:get_price(myProductTitle)函数的输入是一个标题,例如:RazerGoldPINMalaysia7MYR......