首页 > 其他分享 >Replace

Replace

时间:2024-10-16 19:48:05浏览次数:7  
标签:RMQ log 所有 Replace 端点 区间

Replace

cplusoj 链接

题意

给你一个长度为 \(n\) 的序列 \(A\),有 \(q\) 次询问,每次询问对于一个区间 \([l,r]\) 需要操作多少次才能变成区间 \([1,n]\),无解输出 \(-1\)。其中一次操作指原区间变成 \([l'=\min_{i=l}^r\{a_i\},r'=\max_{i=l}^r\{a_i\}]\)。

solution

看了feecle大佬的题解后对其中的结论有也许是另一种理解方式。

首先题目的操作与取 \(\min,\max\) 有关,因此通过丰富的经验和敏锐的观察力显然我没有可以发现:

\[f(l,r)=\cup_{i=l}^{r-1} f(i,i+1) \]

证明(或者应该叫理解方式):对于每个 \(i\),设 \(a_x=\min(a_i,a_{i+1}),a_y=\max(a_i,a_{i+1})\),\(f(i,i+1)\) 对应区间 \([a_x,a_y]\),其中相邻的 \(i\) 对应区间至少有一个端点重合。因此所有的 \(f(i,i+1)\) 并成连续的一段区间,其中最左的一个端点和最右的一个端点就是 \(f(l,r)\) 的两端。可见等式是成立的。

蒟蒻的我不能直接观察出推论,但是也许可以这么想:我们考虑对所有 \(f(i,i+1)\) 再进行一次操作,看看会发生什么。\(f(i,i+1)\) 是若干段首尾相接的区间。每个区间会变成区间最小值和最大值为端点的新区间。由于区间是首尾相接的,因此新区间要么首尾相接要么相交得更多,而所有新区间的最左端点和最右端点一定等于所有区间的最小值和最大值,因此对这些 \(f(i,i+1)\) 再进行一次操作,得到的区间 \(=f^2(l,r)\)。

以此类推,可以得到 \(f^k(l,r)=\cup_{i=l}^{r-1} f^k(i,i+1)\)。

所以我们不需要求所有的 \(f(l,r)\),只需要求所有的 \(f^k(i,i+1)\)。然后是 RMQ 问题求区间最小值和最大值,ST 表即可。

因为 \(f(1,n)=[1,n]\),所以显然操作 \(k\) 次能否得到区间 \([1,n]\) 的 \(k\) 满足单调性,\(k\) 越大越容易得到指定区间。

因此考虑倍增。先求所有 \(f^{2^0}(i,i+1)\),然后求所有 \(f^{2^1}(i,i+1)\),以此类推,每一层都要做一次 RMQ。时间和空间都是 \(O(n \log^2 n)\)。

对每个询问,倍增,每次计算 RMQ 判断是否可以得到区间 \([1,n]\) 即可。时间复杂度 \(O(q \log n)\)。

总时间复杂度是 \(O(n \log^2 n+q \log n)\)。

据说猫树可以单 \(\log\)?感觉不会啊,会的大佬欢迎分享。

标签:RMQ,log,所有,Replace,端点,区间
From: https://www.cnblogs.com/liyixin0514/p/18470792

相关文章

  • Some bytes have been replaced with the Unicode substitution character while load
    需要修改一较旧的网页代码,当打开时,却出现异常提示: SomebyteshavebeenreplacedwiththeUnicodesubstitutioncharacterwhileloadingfile【文档路径】withUnicode(UTF-8)encoding.Savingthefilewillnotpreservetheoriginalfilecontents.点“OK”,文档是......
  • uv --- replacement of conda + pip (python version + package version install) pyt
    uvhttps://docs.astral.sh/uv/AnextremelyfastPythonpackageandprojectmanager,writteninRust. InstallingTrio'sdependencieswithawarmcache.Highlights......
  • replace jdk
    #!/bin/bashjava_processes=$(ps-ef|grepjava|grep-vgrep)running_jdk_paths=$(echo"$java_processes"|grep-oP'/.*?/bin/java'|sort-u)jdk_installations=$(find/path/to/jdk-name'jdk*')idle_jdk_paths=()for......
  • Java零基础-replace(CharSequence target, CharSequence replacement)详解
    哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者......
  • 【编程基础知识】mysql中的insert into ... on DUPLICATE key和replace into的性能对
    一、概述在MySQL中,INSERTINTO...ONDUPLICATEKEYUPDATE和REPLACEINTO都是用来处理插入或更新数据的语句,但它们在性能和行为上有所不同。二、REPLACEINTOREPLACEINTO语句在遇到唯一键或主键冲突时,会先删除旧记录,然后插入新记录。这意味着它会执行两次操作:删除......
  • Ansible `replace` 模块
    Ansiblereplace模块一、简介功能:replace模块用于在远程主机上的文件中替换匹配的文本。它通过正则表达式查找文件中的特定模式,并将其替换为指定的内容。这对于修改配置文件、脚本或其他需要批量文本替换的场景非常有用。使用场景:适用于需要精确匹配和替换文件内容的情......
  • Android T adout replace bootanimation
    idea_1:useotareplacebootanimation.zipidea_2:创建一个新的分区,(用于存放bootanimation.zip)可以让上层读写.idea_3:sucp前提条件:userdebug版本,默认关闭selLinux,可root//df查看设备分区情况,有些分区系统是不让去写的adbshellc4_t:/$dfFilesystem......
  • 金蝶云星空元数据冲突SVN:replaced,tree conflict树冲突解决过程
    问题截图: 解决方式:      ......
  • 036、Vue3+TypeScript基础,路由中使用replace不让前进后退
    01、代码如下:<template><divclass="app"><h2class="title">App.Vue路由测试</h2><!--导航区--><divclass="navigate"><router-linkreplaceto="/Home"class="nav......
  • k8s中apply资源文件和replace资源文件的区别
    v1.29.2版本的k8s中资源对象api-resource一共有75种,比如pod,serverice等等创建资源对象的时候,一般是写资源对象文件,里面主要字段是kind\apiVersion\metadata\spec\status在我们使用资源对象文件创建资源实例的时候经常用到kubectlapply-f resourcefilename.yamlkube......