人类智慧

记录在各种题目看到的人类智慧操作。

[](https://www.luogu.com.cn/problem/)

写得很随便区

+ ([](https://www.luogu.com.cn/problem/))
$\implies$ 
  • 有若干对数,从每对数中选一个使选出的数互不相同(P9170 [省选联考 2023] 填数游戏
    每对数之间连边,有解仅当每个连通块都是基环树或树。
  • 具有周期性的树上点到根路径加问题(P6623 [省选联考 2020 A 卷] 树
    对周期做差分。每个点的答案为进它的子树时的差分值与出子树差分值的差。
  • 一道 DP 题的多个方案会算出重复答案(P7519 [省选联考 2021 A/B 卷] 滚榜
    假设只求最优方案。
  • 在 DP 过程中计算一个单调不降的序列的和(P7519 [省选联考 2021 A/B 卷] 滚榜
    代价提前计算。
  • i=1nj=1ngcd(i,j)P3768 简单的数学题
    i=1nj=1nd|i,d|jφ(d)。(不要老想着转 μ 辣!)
  • 给定矩阵中每个 2*2 子矩阵的和构造原矩阵,满足所有元素 [0,106]。(P7515 [省选联考 2021 A 卷] 矩阵游戏
    先通过 ai,j=bi,jai,j+1ai+1,jai+1,j+1 构造一个没有值域限制的 a,然后构造一个矩阵 [r1c1c2r1r1c3c1r2r2c2c3r2r3c1c2r3r3c3] 使得 a 加上它不会使 b 改变。差分约束解出 r,c 即可。
  • 构造系数使原随机序列和为 0。(P7703 「MCOI-09」Dream and Strings REMATCH
    每次将序列两两配对,到最后期望差值最大值为 1
  • 询问树上与一个点深度相同的合法点个数。(P7394 「TOCO Round 1」History
    在 bfs 序上维护。
  • 动态单点修改字符串/插入字符并查询 LCP。(P4036 JSOI2008 火星人
    使用平衡树维护哈希值并二分哈希。
  • 给定若干条带权路径,求树上不经过某个点的路径的权值最大值。(P3250 [HNOI2016] 网络
    二分 mid,满足 经过这个点的权值不小于 mid 的路径数 < 所有权值不小于 mid 的路径数
  • d|nd。(P3497 [JLOI2014] 聪明的燕姿)
    i=0k(j=1cipij)
  • 网格图上最短路径计数问题。(P6137 [IOI2012] 理想城
    拆成横向和纵向移动;对于每一块 2*2 连通都只用连三条边,于是变成一棵树,因题目特殊性质不会影响答案。
  • 问最少有多少个元素需要操作。(P3447 序列变换
    问最多有多少个元素不需要操作。
  • (nm 约数个数)。(P3327 [SDOI2015] 约数个数和
    i|nj|m[gcd(i,j)=1]

写得没那么随便区

(qwq) 表示自己想到的进度。

### . - [](https://www.luogu.com.cn/problem/)()

8. 2-28 P9167 [省选联考 2023] 城市建造(图论,圆方树,DP)

把删去的边连接的点叫做关键点。在边被删掉后,每个连通块里都要恰好有一个关键点。考虑如果要存在这么一个删掉的边集,关键点集需要满足什么条件。

  • 原图的每个点双只有三种情况:没有关键点,有一个关键点,全是关键点。

如果点双里已经有两个点是关键点,那么为了使它们在删边之后不在同一个连通块,连接它们的所有路径都要断掉。因为在点双里,你肯定会不小心把点双里的另一个点变得跟这两个关键点都不连通,然后就多了一个关键点……

要是放到圆方树上,那么删边就可以转化为删方点。并且删掉的方点必须在忽略圆点后是连通的。于是我们成功将边集转化为了点集。

现在你的目标是通过删方点使得圆方树上的连通块大小差不大于 k。先从 k=0 开始。

  • k=0

你大可以直接枚举连通块大小。

……

  • k=1

7. 2-26 P9170 [省选联考 2023] 填数游戏(图论)

首先你需要知道怎么使 bi 互不相同。扔到图上,每对 bi 之间连一条边。那么有解仅当每个连通块都是基环树或者树,否则不可能每个点都不冲突。

那么根据题意,问题可以转化为:Bob 需要选每条边 (u,v) 定向为 uvvu(即对于这个边对应的集合选择 vu,集合大小为 1 就是 u,v 相等)。而同时对于每条边,Alice 也可以进行定向,Alice 在每条边的定向情况会因为 S,T 的重合情况分为 4 种:定不了,只能定 uv,只能定 vu,两边都可能定。那么 Alice 的任务是通过恰当地定向使得 Bob 在某些边上无论如何都会定得跟 Alice 一个方向。

然后可以大力对每个连通块分讨了。称上面 4 种边中的 2,3 种为单向边,第 4 种为双向边。

  • 是基环树。

你发现其实 Bob 这时只有两种定法,也就是取决于那个环的两种定向。显然非环边只能定向朝叶子的一端。看起来这很好解决。

对于非环边,Alice 肯定会尽量往叶子定向。

对于环边,鉴于 Bob 会选择两种定向方式中重合最少的那种,我们需要让两种定向方式的答案的较小值尽量大,也就是尽量平衡两个方向的边的数量。求出环上两种单向边和双向边的数量,那么问题在于双向边如何分配给两个方向,这是好算的。

注意处理重边自环。

  • 是树。

这时有一个点 Bob 可以不选,那么 Bob 每条边怎么定向取决于这个不被选的点是哪个,那么每条边就只能往外侧定向,相当于是 Bob 以它为根定了一棵外向树。

Alice 的定法要求 Bob 所有定法的最小值最大。考虑怎么搞。

fi 为在目前 Alice 的定向状态下 Bob 以 i 为根的结果。发现对于 Alice 定向的一条 uv,相当于给 u 那一侧的所有 fi 都加了 1

现在问题同样在于双向边。找点性质。你发现如果要使 fi 增加使得最小值更大,对于双向边,如果有两条双向边被定向使得它们朝向的那一端靠得更近(即设有 xyuv 两条边,连接 x,u 的路径会经过 y,v),这时两条边中间的部分的 fi 没有任何变化,其它部分加 1。但是如果将它们同时反过来变成 yxvu,就能使整棵树的 fi 都至少加 1,中间部分加 2。所以这种面对面的情况一定不优。

那什么时候能让这种不优定向方式尽量不出现呢?就是 Alice 的定向也是一棵外向树的时候。换句话说,Alice 会钦定一个根,并且她会尽量把所有边往外侧定向,就能尽量让定向不存在面对面的情况。

那我们枚举这个根是哪个就好了。可以用线段树维护在目前的根时所有的 fi 的值,此时的答案是 minfi。dfs 换根求出每一个根的 minfi 中的最大值即可。

总复杂度 O(nlogn)。需要一定卡常。

6. 2-26 P8293 [省选联考 2022] 序列变换(括号树,贪心)

看似是一个题,实际上是四个题。自己做的时候因为推了假结论当场去世。(qwq)

首先考虑这个很花里胡哨的操作到底是什么东西。如果放到括号树上,那么操作 1 即为把一个点的儿子和它自己接到另一个同级的点上,代价是 x 乘没动的点的值加 y 乘被移动的点的值,操作 2 表示操作顺序你随意。目标状态是一条链。

你发现这个做法似乎跟 x,y 有非常大的关系,所以开始分讨。

  • x=0,y=0
    输出 0
  • x=0,y=1
    尽量把每一层的点都接到同层最大的那个点上面去防止这个最大的造成贡献。可以 multiset。
  • x=1,y=1
    尽量让每层最大的点以后再也不要贡献了。这时可以把其它点先接到最小的点上然后把这个最小的点接到最大的点上。同样可以 multiset。
  • x=1,y=0

发现这个贪心情况好像比较玄学。如果把最小点留在这一层的话会导致它的贡献被过早结束;如果把最大点留在这一层的话会导致它被过多地贡献。因为如果我们也按 x=y=1 的方法先接到最小值再接到实际留下的点上的话,答案就是所有数减去最后一层的值,加上每一层的最小值乘上此层原本的数的个数 2

(等待垃圾博主彻底理解这题在干什么)

5. 2-23 模拟赛 T1(链表,均摊)

01 矩阵,问有多少个子矩阵的和 2n,m5000

先补集转化。然后考虑枚举上下边界。(qwq)将每一列分为没有 1,一个 1,至少两个 1 三类。那么子矩阵会出现在连续 0 以及一个 1 两边的连续 0

发现在下边界逐渐下移的过程中,每列的类型变化是均摊 O(1) 的。也就是会逐渐从 000 变成 1020102,而总变化次数规模 O(n),变化很好处理,考虑答案怎么维护。下边界下移不太好搞,考虑从底端上移上来。那么每个 0 连续段会不断合并,可以使用链表维护。

4. 2-22 P7515 [省选联考 2021 A 卷] 矩阵游戏(构造,差分约束)

(qwq)

先通过 ai,j=bi,jai,j+1ai+1,jai+1,j+1 构造一个没有值域限制的 a,考虑怎么变化 a 使得它满足限制而 b 不改变。

可以构造一个矩阵 [r1c1c2r1r1c3c1r2r2c2c3r2r3c1c2r3r3c3],显然加上之后 b 不会变。差分约束解出 r,c 即可。

3. 2-20 P9169 [省选联考 2023] 过河卒(博弈论,拓扑)

去年考场上把我整不会了。其实现在看感觉只要理解了里面的博弈策略就只剩码力的问题了。

考虑所有可能的棋子状态。发现最多 (nm)3 种,每种状态可能是黑棋或者红棋在走,这也就 2×106,好像挺好的。然后根据题意以及我们的博弈知识:

  • 一个状态为必胜态仅当存在一个后继状态为必败态。
  • 一个状态为必败态仅当所有后继状态都为必胜态。
  • 否则是平局。

首先我们根据题意把所有已经确定为必胜态/必败态的状态找出来。优先级由上到下。

  • 黑棋在第一行:黑棋必胜,红棋必败。
  • 有棋的位置重合:刚操作完的必胜,准备操作的必败。
  • 无法操作:刚操作完的必胜,准备操作的必败。

然后从这些状态开始倒推其它状态。需要魔改拓扑,一个点能被确定状态并且推进队列仅当:

  • 能到一个必败态,被确定为必胜态。
  • 能到的所有状态都是必胜态,被确定为必败态。

至于步数:

  • 必胜态的步数为第一次被必败态倒推到的时候的步数加一。
  • 必败态的步数为最后一次被必胜态倒推到的时候的步数加一。

写就完啦!

等会没完。在 102×106 数据卡满的压迫下并不是随便乱写就飞得过去的。需要一些神秘优化。

  • 你发现实际上每个状态是哪个颜色在走是可以确定的,就是六个横纵坐标与初始状态的差值之和的奇偶性,常数减半。
  • 钦定第一个红棋在第二个红棋的上方,常数再次减半。这时我过了。

(qwq)

2. 2-20 P4318 完全平方数(数论,二分,容斥)

出题人一定认为 1 不是平方数吧。

直接找第几个好数太难了,不如二分答案去看 [1,mid] 里有多少个好数。设它是 f(mid)

数学推导

那么这个完全平方数的正整数倍的定义不难联想到 μ 啊,于是 f(n)=i=1|μ(i)|。也许这时可以杜教筛,但我不会。(qwq)

绝对值不好处理,其实还可以写成 f(n)=i=1μ(i)2。考虑定义,令 i=x2r,那么 μ(i)2=[x=1]=c|xμ(c)=d2|iμ(d)

枚举 d,那么有 f(n)=i=1nd2|iμ(d)=d=1nμ(d)nd2。到这里已经可以 O(TlogVV) 了,V 是答案最大值,根据样例可得约为不到 2×109

感性理解

每个平方数的倍数在 [1,n] 中出现了 nd2 次。感觉这个东西很有容斥的意思。

其实不是很懂为什么这里的容斥系数就是 μ(i)……也许 μ(i) 就是有这种抽象性质吧,或者可以把它理解为一个什么东西反演出来的结果?于是同样可以得到 f(n)=d=1nμ(d)nd2

1. 2-19 P7518 [省选联考 2021 A/B 卷] 宝石(树剖,倍增)

先考虑链的部分分。可以维护每个点能从最近的第几颗宝石开始走到,查询时上个数据结构二分答案,然后取出答案对应的宝石所在的点看看有没有办法从区间内的一个点出发走到。感觉很容易做到双 log 呢,尝试把它搬到树上!

搬不上去……(qwq)

瓶颈在于如果要把树用链的套路做,那不管是树剖还是倍增,链都不止一条,但是你在不同的链之间转换的时候所谓的“起点”可能是任何一颗要取的宝石,既然连整条链上第一个被取到的宝石是哪一种都不确定,显然没有办法快速维护,重开吧。

发现一个事情:虽然我不知道我在每条链上是从哪种宝石开始取的,但是我知道每颗宝石被取的时候下一颗宝石是什么颜色的。可以把链上的每一个点,向它对应的宝石的下一颗所在的最近的点连边,那么宝石的取法就可以变成每条链上的一段路径。树剖一下把询问路径砍成一堆链,倍增一下就可以求出每条链里面的结果,问题就在于两条链之间要怎么衔接。假设我已经知道上一条链取到了那个颜色,那么我只要在下一条链上找到最近下一个颜色然后继续跑就行了,这个可以上一些类似在 map 套 vector 上二分之类的抽象东西做到。

总复杂度 O(qlog2n)

posted @   CarroT1212  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示