// 鼠标点击特效 //

杂题选做3

杂题选做3

QOJ2618

三个节点还是不好做,考虑仅有两个节点 x1,x2 该怎么做?

我们可以使用动态规划法来解决这个问题:设 fi,j 表示还有 j 秒,此刻 x1x2=i 的概率,转移可以枚举当前会发生的每一种状态:

fn,m=13fn,m1+13(p100fn+1,m1+100p100fn1,m1)+13(p100fn1,m1+100p100fn+1,m1)

整合一下:

fn,m=13(fn,m1+fn1,m1+fn+1,m1)

居然和 p 没关系,确实没关系。

但是这样直接做是 O(nk) 的,怎么办呢?发现这个转移明显是很多个多项式卷积得来的,分治fft优化一下既可以做到 O(nlogn)

现在有三个点 x1,x2,x3 ,该怎么办呢?发现这三个点之间的距离就是 x1,x2 的距离加上 x1,x3 的距离加上 x2,x3 的距离然后除二即可。所以解决了两个点就可以解决三个点。

时间复杂度 O(nlogn)

QOJ2605

逆天构造题。

合法点集的要求有点像选出二分图的左部和右部点,我们先对原图构造一张至少有 nk 条边的二分图:

按照编号从小到大进行二分图染色。对于节点 u ,仅考虑 v<u(u,v) 有边的节点 v 构成的集合 s 。如果 s 中的点在二分图的左部更多,则将 u 放入二分图的右部;反之放入左部。

容易发现这样的构造,二分图的边数不会小于 m2 ,也就是 nk

接下来我们找到度数小于等于 k 的点,删除,一直循环直到所有节点度数都大于 k ,此时就是一组解。一个比较平凡的实现就是使用set维护所有节点的度数,然后每一次取出度数最小点进行修改一类,时间复杂度为 O((n+m)logn) ;但是注意到,如果一个节点 u 的删除导致某些节点度数小于等于 k 了,那一定是与 u 直接相邻的节点,所以使用一个队列维护即可,时间复杂度为 O(n+m)

但是有没有一种可能,我们上面的流程把图删空了呢?其实是不可能的,假设当前还有 n 个点和至少 nk 条边,因为我们只会删除度数小于等于 k 的点,所以进入 n1 个点的时候,也有至少 (n1)k 条边。我们归纳的证明,上述流程结束之前的任何时刻,假设目前有 n 个节点,就一定有至少 nk 条边。因为一定存在某一个时刻 nk>n(n1)2 ,所以不会被删空。

QOJ1243

画图发现不会存在两个点 p,q ,两点均不是矩形的四个角。所以至多只有一个节点 p 不是矩形的四个角。我们枚举 p ,剩下的点只会出现在左对角/右对角中。分类讨论每一个矩形对 p ,左对角,右对角的覆盖情况:

  • 仅覆盖 p ,可以放入左对角和右对角。
  • 覆盖 p ,左对角,可以放入右对角。
  • 覆盖 p ,右对角,可以放入左对角。
  • 仅覆盖左对角,可以放入 p 或者右对角。
  • 仅覆盖右对角,可以放入 p 或者左对角。
  • p ,左对角和右对角都没有覆盖,可以放入 p 或者左对角或者右对角。

我们可以枚举上述 24 种情况进行计算。左右对角也分(左下角和右上角,左上角和右下角),所以一共 48 种情况。时间复杂度 O(XY+n)

QOJ7254

肯定考虑dp,关键在于如何去重。我们设 fi,j 表示考虑 a 序列长度为 i 的前缀和 b 序列长度为 j 的前缀合并,可以得到多少种完全不同的序列。

一个最为基本的转移就是 fi,j=fi1,j+fi,j1

这样算重复的原因就是,可能存在 a[1i]b[1j] 的一个长度为 k 的公共后缀。假设取完了 a[1ik]b[1jk] ,这样的后缀会使得答案算多因为可以让 ab 的操作交换。

得到一个转移:

fi,j=fi1,j+fi,j11klcs(i,j)fik,jk

但是这样依然不对。假设取出了两个完全相同的,长度为 p 的后缀,也可能在转移过程中到达某一个状态 fiq,jq ,其中 q<p 但是也是 a[1i],b[1j] 的公共后缀。我们可以直接使用卡特兰数避免这种情况(折线图不允许触碰 x=y)。

得到转移:

fi,j=fi1,j+fi,j11klcs(i,j)fik,jk×H(k1)

最后分析一下时间复杂度,是 O(n3) 吗?不对,因为排列的限制,所以对于一个前缀 a[1i] ,仅有一个前缀 b[1j] 满足 lcs(i,j)0 ,所以时间复杂度应该是 O(n2)

QOJ7308

打表发现:f1=1,f2=2,f3=6,f4=16

对于 n>4,fn=2fn1+fn3+2 ,使用矩阵优化。时间复杂度 O(Tlogn)

QOJ1087

首先,这种二进制问题是优先考虑拆位的。我们看看这个问题在每一个二进制位的体现:

你需要给每一个位置赋予一个 01 权值,要求某些区间的权值全部是 1;某些区间的位置中至少存在一个 0

先不考虑删除第 i 的限制的影响,对原问题求出是否有解。我们将“要求区间内部全是 1” 的限制优先考虑,先对 li,ri 做区间覆盖,获得数组 a 。然后检录 “要求区间内部至少存在一个 0” 的限制的合法性。

现在讨论删除某一个限制的影响,根据删除的限制的种类分讨:

  • 删除的是“要求区间中间至少存在一个 0”的限制,那么对于 a 不会有任何改变。如果本身不合法的区间只有这一个,那么删除之后整个局面就会变得合法起来。

  • 删除的是“要求区间中间全部都是 1”的限制,那么会导致某一些 ai1 变成 0 ,哪些位置会从 1 变成 0 ?就是被覆盖了恰好一次的位置,我们可以对于每一个限制,求出被 [li,ri] 覆盖,且仅被 [li,ri] 覆盖的下标集合 s

具体而言,先求出每一个位置的覆盖次数,然后寻找 [li,ri] 内仅被覆盖一次的位置,可以使用并查集之类的算法找到。

接下来,将 s 排序后得到数组 b 。认为 b0=0,b|s|+1=n+1 。如果存在某一个不合法的区间 [l,r] ,满足 i[0,|s|],bi<lr<bi+1 ,那么就说明这个区间内部依然全部是 1

我们考虑枚举每一个 i ,然后查询是否有区间被 (bi,bi+1) 包含,显然可以使用一个线段树维护。

时间复杂度 O(nlognlogV)

posted @   dan-da-dan  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示