2023 年 12 月训练记录

2023 年 12 月训练记录

怎么就寄了呢。

没救了。

不能再摆了。

CF1824E LuoTianyi and Cartridge#

我们对最小值做扫描线,现在就转化成了使得 b+d 最大。

我们考虑点与边合法的充要条件。

注意到假设有 k 个点,k1 条边,只要满足对于每条边的两部分都有点就是合法的,否则不合法。

这显然是必要的,充分性的话,就是考虑除非整个图连通,否则一定存在两个点,分别在这条边的两部分,并且它们不在同一个连通块内。

假设当前有 p 个点,e 条边,并且每条边两部分都有点。

如果 p1<e,则说明点可以全选,边直接保留前 p1 大即可。

否则,可以证明边一定全选。那么对于每条边都要求它的两端都要选点。我们把边按照其深度教大的点,放到 DFS 序上考虑。那么也就是要在每个区间内和区间外都有选点。

注意到 DFS 序要么不交,要么包含,所以也就是所以极小的 DFS 序区间,要在这里面选一个点。如果存在一个区间包含所有区间,则还得再外面再选一个点。

整个过程都是可以 O(nlogn) 来维护的。

记录

CF1824D LuoTianyi and the Function#

提供一个树状数组做法。

orz kcudcigam

注意到求的是历史和,那不妨就转化成 [1,r] 减去 [1,l1]

考虑维护关于行的一次函数,答案表示为 ans=kx+b,用一个数据结构维护 k,一个数据结构维护 b

那每添加一个数,就相当于 KB 上的区间加,然后查询就是查的区间和。

然后使用区间加,区间和的树状数组来支持 KB 即可。

注意到区间加,区间和也是维护一次函数,用两个树状数组来实现,所以总共用了 4 个树状数组。

时间复杂度 O(nlogn)

记录

CF1464F My Beautiful Madness#

注意到所有路径中,假设深度最深的 LCA 为 x

则所有路径的 d 邻居有交,当且仅当 xd 级祖先 y 与路径的 d 邻居有交。

证明:首先把 y 往上拉 x 就不合法了。由于 x 是深度最深的 LCA,所以 LCA 在 y 子树内的一定合法,所以把 y 往下拉是没有意义的。

所以我们只需要判断 x 是否合法。由于 LCA 在 y 子树内的都合法,所以我们只需要考虑 LCA 在 y 子树外的了。

yd 级祖先为 z

  1. LCA 在 z 子树外。

    1. 如果这条路径跟 z 的子树不交,则不合法,这是好判的,我们用 BIT 在 DFS 序上维护树上差分即可;
    2. 如果这条路径跟 z 的子树有交,则合法,因为这条路径一定经过 z
  2. LCA 在 yz 的路径上。

    这种情况必然合法。

  3. LCA 不在 yz 的路径上,但在 z 的子树内。

    则到 y 的最近点为其 LCA。

由于在路径上的 LCA 必定合法,所以我们就只需要求 LCA 在 z 子树内的到 y 的最大距离。直接在 DFS 序上,用线段树维护直径即可。

使用 O(nlogn) O(1) LCA,时间复杂度 O(nlogn)

记录

CF1411G No Game No Life#

首先,我们可以对这个 DAG,O(n+m) 的求出所有点的 SG 值。然后,问题就转化成了有一个变量 x,初始为 0,每次选随一个 [1,n+1] 的数 y,如果 y[1,n],则 xxsgy,否则结束。

问结束时,x=0 的概率,这样就能求输的概率,然后就求出了赢的概率。

注意到 m 条边的 SG 值,不超过 O(m),所以 SG 的值域是 O(m) 级别的,在本题中就是 512

所以,我们可以列状态 fi 表示当前变量 x=i,最后 x=0 的概率。

然后对这个高斯消元即可求出答案。

时间复杂度 O(mm)

不过有更优秀的做法,给 gxy001 大神磕头了。

fi 表示一次操作使得 xxi 的概率。令 gi 表示最终 x=i 的概率。

G=i=01n+1Fi=1(n+1)(1F)

我们考虑对 1F 求异或卷积逆即可得到答案。

对于异或卷积,有逆当且仅当 FWT 后每一项都非 0

那么考虑 FWT 的过程,fi=j=02k1(1)popcount(i and j)fj,每一项 fj 对于 fi 的贡献都是 ±1

注意到这个常数项 1 相当于给每项都加了 1,因为 and 出来是 0

由于 0fii=02k1fi<1,所以 0<fi<2 的。

所以有逆。

于是我们只需要对 F 做一次 FWT,然后对点值求逆,然后再 iFWT 回去即可。

时间复杂度 O(n+m+mlogm)

记录

注意到这个做法,可以对所有的最后的 x 求出答案。

深入思考:对于异或卷积来讲,如果有逆,则逆是有限的;而对于多项式求逆来讲,逆是无限项的,所以直接对点值求逆,求出的是循环逆,相当于是在模 xn1 意义下的,而不是在模 xn 意义下的。

CF1912F Fugitive Frenzy#

orz zmx

假设当前警察在 i,我们考虑先让小偷先确定出在每个叶子 j 的概率,假设是 pi,j

fi 表示警察当前在 i 节点,抓到小偷的最小步数。

那么注意到警察的策略一定是选择一个叶子 j,因为小偷已经确定好了,所以在警察到叶子 j 前不会乱动,所以抓到小偷的概率为 pi,j,所以 fi=(1pi,j)fj+disi,j

注意到答案一定是分数,如果做法跟精度无关,完全可以出成取模。

上面都是赛时想到的部分,下面都是 zaozao_zmx 大神很厉害的求解方法。

注意到 pi,j 的元太多了,我们移项,得到 pi,j=fi+fj+disi,jfj

注意到 jipi,j=1,所以,jifi+fj+disi,jfj=1

想求解 fi,我们可以初始时令 fi=1,这是因为我们有除法,所以我们避免 0

然后随机一个位置 i,根据这个等式求出 fi,把这个过程执行 106 次即可。

posted @   zhaohaikun  阅读(346)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示
CONTENTS