首页 > 其他分享 >一些困难题

一些困难题

时间:2024-08-08 20:05:49浏览次数:8  
标签:路径 困难 pos 生成 leq quad forall 一些

加训一下。

1. [ARC181E] Min and Max at the edge

场上没人过的神题。(大概是搬运的官方题解)

先考虑如何 chk 一个图是否存在好生成树。观察好生成树的限制,发现其对于非树边的限制是在生成树上连接两点的路径有关。而 Kruskal 的证明就是对于每条非树边,其边权大于所有其路径上的树边,两者很像。

但是题目中的限制是点的限制,转到边上的想法是给点赋点权 \(X_i\),然后 \((u,v)\) 的边权为 \(|X_u-X_v|\)。考虑把 \(X\) 设成一个递增的序列,比如 \(X_i=10^i\),这样边权一定互不相同。

对于一棵好的生成树,设 \(S(u,v)\) 表示 \(u,v\) 之间的树上路径,则对于点 \(i\) 要求 \(\forall i\in S(u,v),X_u\leq X_i\leq X_v\)。而对于边 \((x,y)\),\(X_u\leq X_x,X_y\leq X_v\)。设其根据上述定义的边权是 \(w(x,y)=|X_x-X_y|\),则 \(\forall (x,y)\in S(u,v),w(x,y)<w(u,v)\)。这就证明了好的生成树一定是新图中的最小生成树。

因为可以构造出边权互不相同的情况,所以这也证明了好的生成树也是唯一的。跑出来这个图的最小生成树之后,检查每条非树边,如果都满足限制则该图是好的。

但是题目有多次询问,而且这个最小生成树也不是那么好求。不难发现其实图中定义的边权只需要满足 \(\forall i<j<k,w(i,j)<w(i,k)\) 并且 \(\forall i<j<k,w(i,k)>w(j,k)\) ,即满足区间包含单调性即可。

所以可以把边 \(w(u,v)\) 赋为 \(v\times(n+1)-u\),这样得到的生成树一定满足对于任意非树边 \((u,v)\),其路径上的最大值就是 \(v\)。原因是非树边 \((u,v)\) 路径上的边权应当都小于 \(w(u,v)\),所以如果存在大于 \(v\) 的点则一定不合法。而且因为是 \(-u\),所以合并两个连通块的时候,一边选择的较小的点会尽可能的大,这也满足路径上的最小值尽量是 \(u\)。

但是这样还是需要 chk 路径上点的最小值是否满足条件。可以再反着做一遍,\(w(u,v)=(n-u+1)\times(n+1)-(n-v+1)\),同理得这样求出来的东西的最小值一定合法,最大值尽量合法。因为已经证明了好的生成树唯一,所以判一下两棵树是否相同即可。

这样就将问题转化成了比较好的形式:删边求最小生成树,可以看成是找一条非树边 \((x,y)\) 满足 \(x\in \text{subtree}(i),y\notin \text{subtree(i)},w(x,y)\) 最小。转成 dfn 序之后可以看成是两个 3-side 矩形查最小值,可以扫描线线段树维护,复杂度是 \(\mathcal O(n\log n)\)。

2. [ARC181F] Colorful Reversi

首先观察一下,对于 \(a,b,c,a\) 这种情况来说,两个 \(a\) 之间永远不可能发生操作。而 \(a,b,c,b,a\) 这种情况,两个 \(a\) 之间是有关联的。有一个很天才的想法是建树,一开始只有一个节点表示 \(a_1\),维护一个指针 \(pos\) 表示当前在树上的哪个节点,接下来依次加入每个点 \(a_i\):

  1. 若 \(pos\) 所在点的颜色和 \(a_i\) 相同,则 \(pos\) 不动。
  2. 否则若 \(pos\) 所在点有邻点的颜色是 \(a_i\),则 \(pos\) 走向该邻点。
  3. 否则新建一个节点,颜色为 \(a_i\),\(pos\) 走向该节点。

这样就得到了一棵操作树,它有一些很好的性质:

  1. 假设生成时在上面走过的路径是 \(B\),则操作 \(l,r\) 等价于把 \(B[l,r]=\{x,y,y\dots y,y,x\}\) 变成 \(B[l,r]=\{x,x\dots x,x\}\)。
  2. 对于原序列,如果能够操作 \([l,r]\) 则 \(l,r\) 一定属于同一个点,否则 \(l,r\) 属于不同的点。
  3. 对于路径 \(\{v_1,v_2,v_3\dots v_k\}\),通过操作将其变成 \(\{v'_1,v'_2,v'_3\dots v'_k\}\) 的最小代价是 \(\sum_{i=1}^k d(v_i,v'_i)\),其中 \(d(x,y)\) 表示两点树上的距离。

接下来,对于 \(pos\) 的起始节点 \(x\) 和终止节点 \(y\),最终序列的形态是若干个颜色段,而颜色恰好就是从 \(x\) 走到 \(y\) 所经过的简单路径上的颜色。证明很简单,显然路径上两个不同的颜色段永远无法合并,而如果存在其他的颜色则其两边的颜色一定是相同的,能再操作一次。

所以拉出树上 \(x,y\) 之间的路径,对于此路径外的部分一定会合并到路径上,可以先 dfs 一遍算出贡献,这样可以得到从 \(B\) 得到一个新的序列 \(C\)。接下来要解决问题的就是:现在有一个序列 \(C[1,n]\),满足 \(\forall i<n,|C_i-C_{i+1}|\leq 1\)。现在要生成一个新的序列 \(C'\),满足:

  1. \(C'_1=C_1,C'_n=C_n\)。
  2. \(\forall i<n,C'_{i+1}-C'_i\in[0,1]\)。
  3. \(\forall i<n\wedge C'_{i+1}=C’_i+1,C_i=C'_i,C_{i+1}=C'_{i+1}\)。

在此基础上满足 \(\sum_{i=1}^n |C_i-C'_i|\) 最小。设 \(f_{i}\) 表示考虑了 \(\leq i\) 的 \(C\),\(C'_i=C_i\) 时代价的最小值,\(pre_i\) 表示 \(C_i\) 上一次出现的位置。转移比较简单:

\[f_i=\min \begin{cases} f_{i-1}\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad C_i=C_{i-1}+1\\ f_{pre_i}+\sum_{j=pre_i}^{i}|C_i-C_j|\;\;\;\;\;pre_i\not=-1 \end{cases} \]

因为 \(pre_i\) 是上一次出现的位置,所以对于所有的 \(j\) 要么 \(C_j\) 全部大于 \(C_i\),要么全部小于 \(C_i\),可以前缀和处理一下 \(\mathcal O(1)\) 转移。这样 \(f_n\) 加上之前把树缩成一条链的代价就是答案,复杂度是 \(\mathcal O(n)\) 或 \(\mathcal O(n\log n)\)。

标签:路径,困难,pos,生成,leq,quad,forall,一些
From: https://www.cnblogs.com/WrongAnswer90/p/18349631

相关文章

  • Spring关于bean的一些基本知识
    在spring这座大厦中,去除掉最底部的核心(core)组件,那么最重要的无疑是bean和bean工厂。剩余是AOP、设计模式,更之上的就是各种组件:DATA,WEBMVC... 为了便于行文,这里把bean和bean工厂统称为bean。bean英文的意思是豆子。为了符合它的实际作用,本人把bean翻译为“缓存对象实例”,但......
  • Flask 应用程序中 HTML 脚本标签中的代码会引发一些烦人的小错误
    Home.html文件:<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>Home</title><linkrel="stylesheet"type="text/css"href="{{url_for("static",filename="css......
  • Spring中Bean的一些基础概念
    什么是SpringBean?Bean代指那些被IoC容器所管理的对象。什么是SpringIoCIoC(InversionofControl:控制反转)是一种设计思想。IoC的思想就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理控制:指的是对象实例化的权力反转:控制权交给外部环境(Spring框......
  • sql注入一些学习笔记
    以下内容主要是作为自己学习笔记记录使用,可能会有错误,欢迎指正,所有内容仅供参考,部分名词内容解释来自其他博主或chatgpt,如有侵权,联系删除一些基础的表information_schema.schemataschemata_name其实就是databasesCatalog_name每个Catalog包含多个Schema,每个Schema包含......
  • Linux文件系统的一些基本概念
    Linux文件系统简介在Linux操作系统中,一切被操作系统管理的资源,如磁盘驱动器、打印机、普通文件或目录等,都被视为文件进行管理和访问。在Linux系统中,“一切都是文件”。Linux系统可以通过统一的文件接口来管理和操作不同类型的资源。Linux可以使用类似于读写文件的方......
  • 一次数据库迁移遇到的一些问题
    简单数据库迁移操作迁移方案迁移方案很简单,首先将旧的库dump下来,然后在新库中导入旧的库dump下来的文件.#旧库dump的指令mysqldump-hhost-Ppost-uuser-pdatabase>database_backup.sql#新库导入的命令mysql-hhost-Ppost-uuser-pdatabase<databas......
  • 即将博三,一些感悟
    今天是20240807,很久没有更新了,就在半月前左右,我的第一篇TAP已经被收录,非常开心,因为我的毕业已经得到了保证,但是不开心的是,这篇文章的模型设计和测试其实本质上我没有任何参与,我相当于捡漏,完成了之前没有完成的文章的撰写和修改,站在了前人的肩膀上,得到了如此成果,其实还是有那么......
  • pg一些常用语句记录
    查看数据库大小pg_size_pretty:将数据库用量展示为KB、MB、GB等样式,查看更直观查看具体某个数据库的大小selectpg_size_pretty(pg_database_size('postgres'));查看所有数据库的大小selectpg_database.datname,pg_size_pretty(pg_database_size(pg_database.datna......
  • uniapp vue3 转换华为鸿蒙(以及问题一些解决方案)
         主要是从Windows系统配置、配置离线SDK和DevEco-Studio、HBuilderX、三方面进行配置。     因为我也是之前写小程序的用uniappvue3写的看官网(uni-app开发鸿蒙应用|uni-app官网)的时候看到vue3uniapp写法可以转换华为鸿蒙开发,我就自己来尝试一......
  • [算法] 一些分治
    普通分治其实没啥,每次只计算跨越分治中心的区间的贡献,剩下的递归到左右两边进行分治;时间复杂度:分治树高度为$\Theta(\logn)$,乘上其他操作的复杂度即可;例题一:现在有一个$n$阶排列$a$,计算:\[\sum^{n}_{i=1}\sum^{n}_{j=i}\min(a_i,a_{i+1},...,a_j)\]......