6 月记录

P11203 [JOIG 2024] 感染シミュレーション / Infection Simulation

存在贪心模拟跳跃的过程。

发现可以跳到下一个点有限制,建出这棵内向树。

倍增就能找到最终跳到的点。

最后查询与 \([l,r]\)\(\ge x\) 的区间数量,这是简单的。

P11236 [KTSC 2024 R1] 水果游戏

P11621 [Ynoi Easy Round 2025] TEST_139

3-side,4-side 转 2-side 然后乱搞搞就行了。

AT_arc199_a

AT_arc199_b

AT_arc199_c

AT_arc199_d

CF2111G

CF2115C

CF2115D

背包问题 2

单位根代入 dft,idft 化简式子。

动物园大会

AT_arc136_f [ARC136F] Flip Cells

优秀 GF 题。

https://www.cnblogs.com/apjifengc/p/17073607.html

ARC200

ARC160F

染色(dye)

多个卡特兰数卷起来的系数。

群论做本质不同。

P12506

P3547

P11739 [集训队互测 2015] 普罗达科特

集合划分容斥,群论。

https://www.cnblogs.com/whx1003/p/16002494.html

二项式系数

符号化方法

讲课题目

  • QOJ5374 数圈

  • Beautiful Bins(DMOPC '22 Contest 2 P5)

  • P6646 [CCO 2020] Shopping Plans

  • qoj7605 [PR 12] 划分序列

  • qoj8904 / gym101821B LIS vs. LDS

  • qoj11549 Inverse Knapsack

  • B 多边兽 / qoj4264 组合技术,拆分数,Burnside 引理,容斥,拉格朗日插值,多项式

  • [B Archery / P9112] 找性质,贪心,模拟,二分

  • Min Product Sum(AGC039F)

  • Cat Jumps(AT_wtf22_day2_d)

  • 宇宙怪盗/Space Thief(JOIST 2025)

  • NAND Tree(AGC050F)



  • qoj5171 [集训队互测 2022] 理论出线

  • CF1534H Lost Nodes

  • P9523 [JOISC 2022] 复制粘贴 3

  • qoj4273 [CTS Round #1 Day 2] 删串

  • uoj682 [UR 22] 月球铁轨

  • P9109 [PA 2020] Tekstówka

  • qoj9518 [集训队互测 2024] 观虫我

  • CF1804H Code Lock

  • CF1761G Centroid Guess

  • P5659 [CSP-S2019] 树上的数

  • CF1656I Neighbour Ordering

  • P10353 [PA 2024] Grupa permutacji

  • uoj940 [Goodbye Jiachen] 黑桃国王

qoj5171 [集训队互测 2022] 理论出线

每场比赛的参与者构成区间 \([l_i,r_i]\),单增,设 \(a_i=v-w_i\),则问题变为每个区间选一个位置令 \(a_i-1\),最小化 \(a_i<0\) 位置个数。

考虑 dp 被放弃的 \(a_i\),考虑相邻被放弃的位置 \(p,q\),则包含于 \((p,q)\) 的区间,贪心选最左的 \(>0\) 的值 \(-1\),一直跑到某个区间减不了了,那么 \(q\le r_j\),称其为 \(next(p)\)

若知道 \(next(p)\),则 dp 是好做的。

考虑怎么优化。

固定 \(p\),求出以下值:

  • \(q_1\) 为满足 \(a_q<0\) 的最小 \(q\)
  • \(q_2\) 为满足包含于 \((p,q]\) 的区间个数 \(>\sum a(p,q]\) 的最小 \(q\)
  • \(q_3\) 为满足左端点 \(\in (p,q]\) 的区间个数 \(<\sum a(p,q]\) 的最小 \(q\)

\(q_1,q_2,q_3\) 的最小值为 \(q_1\),则 \(next(p)=q_1\)

若为 \(q_2\),则说明跑上面贪心时,\(a_{p+1},a_{p+2},\cdots,a_{q_2}\) 被减到了 \(0\),然后还有区间要选,则 \(next(p)=q_2\)

若为 \(q_3\),则说明即 \(a_{p+1},a_{p+2},\cdots,a_{q_3-1}\) 都被减到了 \(0\),而 \(a_{q_3}>0\),所以中间的段没用了,\(next(p)=next(q3)\)

所谓最小「异常」位置 \(q\) 指的就是 \(a_{p+1},a_{p+2},\cdots,a_q\) 均“照常”被减到了 \(0\),然而在 \(a_q\) 处却发生了一些意外。其意义就在于能够得知贪心运行到 \(q\) 处时 \(a\) 数组的现状。很多问题都具有这样的特点:某种规律一直持续着,直到某种异常发生让规律崩解。利用持续规律的信息和崩解发生条件的信息可以还原出我们想要的东西。

然后前面的东西都是好做的。

P9523 [JOISC 2022] 复制粘贴 3

CF1534H Lost Nodes

\(u\) 其实返回的就是其在 \(S\to T\) 上的投影。

如果没有固定 \(u\) 子树内必有一个端点的限制,则询问 \(v\),若返回 \(u\) 的祖先 \(z\),则其在 \(z\) 子树非 \(z\to u\) 第一个点子树范围内,否则返回 \(v\),表示在 \(v\) 子树内。

而发现若你将 \(v\) 定位 \(u\) 子树内的一个叶子,在子树外的返回是一样的,而在子树内的返回是 \(LCA(v,t)\),信息量更多。

那么考虑交互,定义 \(solve(x)\) 表示已知有一个端点在 \(x\) 子树内:

  • 遍历一个儿子 \(v\),询问这个儿子子树内的叶子。
  • 若返回 \(t\ne x\),则确定端点在 \(v\) 子树内的位置,返回 \(solve(t)\)
  • 否则继续遍历儿子。

考虑最小化步数,记 \(f_u\) 来表示,则叶子 \(f_u=1\)

随便取一个儿子排列 \(p_i\),则有 \(f_x=\max_{k=0}^{son-1} f_{p_k}+k\),因为我们在 \(f_{p_k}\) 的第一次询问中就能知道端点是否在 \(p_k\) 子树内,所以 \(f\) 的定义有点不严谨。

显然最佳排列是按照 \(f_v\) 从大到小排序。

对于根:

\[ans_x = \max_{y_1, y_2 \in son_x, \mathrm{rank}(y_1) < \mathrm{rank}(y_2)} \mathrm{rank}(y_2) + f_{y_1} + f_{y_2} - 1 \]

然后换根即可。

https://www.cnblogs.com/werner-yin/p/15920750.html

P6646 [CCO 2020] Shopping Plans

uoj682 [UR 22] 月球铁轨

快进到设 \(f(a,T)\) 表示 \(a\)\(T\) 这个线性空间内异或能得到的最大值,\(g(a,T)\) 为最小值。

有性质:\(f(a,T)\oplus g(b,T)=f(a\oplus b,T)\)

先对 \(T\) 消元使得其变为正交线性基。此时 \(T\) 中的元素互不相交,那么 \(f(x,T)\) 相当于将 \(x\) 的位置划分为若干集合,每个集合用 \(T\) 的对应集合调整。对于 \(f(x\oplus y,T)\) 来说,调整策略应该是观察该集合 \(x\oplus y\) 是否相等,如果相等那么调整一下使得答案变大,否则肯定不调整。那么如果我们考虑将 \(x\) 的最高位尽可能地调整为 \(1\),而 \(y\) 的最高位尽可能地调整为 \(0\),就得到了我们的目的。

我们要求 \(f(s_{i-1}\oplus s_j,T(i,j))=g(s_{i-1},T(i,j))\oplus f(s_j,T(i,j))\) 的第 \(K\) 小值。

考虑对 \(r\) 扫描线,维护 \(k\) 个集合 \(S_1,S_2,\cdots,S_k\),有 \(\mathcal O(nk)\) 次修改,每次将 \(x\in S_i\) 修改并移动到 \(S_{i+1}\)\(\mathcal O(nk)\) 次询问,每次询问某个 \(S_i\) 中的 \(x\) 的个数。

我们可以扫描线维护出所有 \(T_{i,r}\) 以及 \(f(s_{i-1}, T_{i,r})\),并且维护 \(m\) 棵 trie,第 \(t\) 棵包含所有维度为 \(t\)\(f(s_{i-1}, T_{i,r})\)

对于 \(r\),找出其 \(m\)\(g(s_r,T_{i,r})\),每种对应一个维度,那么就是查找第 \(dim(T_{i,r})\) 棵 trie 上 \(ans\oplus g(s_r,T_{i,r})\) 的值。

考虑逐位确定答案,确定每一位,由 trie 的上一层维护出下一层。

qoj4273 [CTS Round #1 Day 2] 删串

等价于删除任意长度 \(>1\) 的连续段。

显然我们每次删空连续段是最优的。

要么删除开头结尾的 \(2\),要么将 \(?2?\) 变为 \(2\)

开头结尾可以不考虑,只需根据串长,判断能否删成 \(1/2\)\(2\) 即可。

任意时刻,串中每个字符对应原串长度为奇数的区间,若 \(12\) 串长度为偶数,则考虑最后剩下两个 \(2\) 对应的区间,这个串可以被删空等价于可以将串划为两个长为奇数的部分,两个部分分别可以被删空。

于是考虑长度为 \(2k+1\) 的情况,若 \(a_{k+1}=2\),可直接删空。

否则找到左右最近的 \(2\),然后调整,将其中一个 \(2\) 拉到中间位置上,能满足条件需要满足两侧最近的 \(2\) 中间不包含超过 \(k\)\(1\)

对于奇数情况的判断是简单的,对于偶数情况寻找划分点也可以做到线性,因此总复杂度为 \(\mathcal O(n)\)

CF1804H Code Lock

这个就很牛了,对角切开,可以有劣弧的性质确定两者贡献,于是转一圈即可。

先分出 \(S,T\),每次分步转移,先转移 \(S\),再转移 \(T\)

CF1761G Centroid Guess

如果确定了一条路径满足重心在上面,我们可以通过询问知道每个点挂在排名为多少的点上,就能求出重心了。

若重心不在 \(S\to T\) 上,则存在一个类包含大于一半的点,从这个类随机选出一个点,则根据重心的定义,有 \(\ge \frac{1}{2}\) 的概率处在重心的子树内,即有 \(\ge \frac{1}{2}\) 的概率得到一条包含重心的链。

然而上述过程操作太多了。

考虑继续随机化,随机采样 \(157\) 个点,判断是否存在包含 \(\ge 79\) 个点的类。

若重心不在 \(S\to T\) 上,则因为有一个极大类,所以这样的类有 \(\ge \frac{1}{2}\) 的概率会出现在正确的大类上,从该类中随机选出一个点,则一共有 \(\ge \frac{1}{4}\) 的概率得到一条包含重心的链。

但是上述做法,在重心在 \(S\to T\) 上时会出问题,我们可以利用将 \(S\to T\) 替换为 \(S\to u\)\(T\to u\) 的自由度来尽可能留住重心,我们考察 \(u\) 的投影左右侧哪边的采样点更多,根据这个来定。

这样的话,只要重心所在的点的子树内有 \(\ge 40\) 个采样点就一定能被留住。

分析一下错误率极小。

P5659 [CSP-S2019] 树上的数

诶,直接做就行了吧。

P10353 [PA 2024] Grupa permutacji

【PR #12】划分序列 / Yet Another Mex Problem

AT_wtf22_day2_d Cat Jumps

考虑先将元素 \(a_i\) 看成有序的,最后除以每个数出现次数的阶乘。

进行一次容斥,钦定 \(k\) 次到达和为 \(0\),可以先划分集合。

\[f_i=\sum_{j\ge i} \binom{j-1}{i-1}g_j\\ g_i=\sum_{j\ge i}(-1)^{j-i}\binom{j-1}{i-1}f_j \]

推不出式子的时候可以转置求逆。

然后一个集合内的方案数就是 \((sum+1)(sum+2)\cdots (sum+|S|)\),一个划分方案的贡献为所有段的方案数的乘积再乘上 \(k!\)

这个贝尔数的复杂度不能要。

考虑组合意义,有一个完全图 \(i\to j\) 有边权 \(a_j+[j\le i]\),则定义同一集合内每个点只能连向同一集合内的点,所有方案的边权乘积的和,就是对的,因为集合内编号第 \(i\) 小的所有连法的和就是 \(sum+i\)

那么最终连出来的是基环森林,设最终连出来了 \(k\) 个基环树,则对应原来的 \(i\) 个集合划分方案是 \({k\brace i}\)

进行二三次容斥,钦定有 \(k\) 个基环森林,那么这些基环森林可以进行划分。

\(f_i\) 表示原来钦定的 \(i\) 个集合的答案,\(g_i\) 表示最终连出 \(i\) 个基环树的答案,\(h_i\) 表示钦定连出 \(i\) 个基环树的方案。

\[f_i=\sum_{j\ge i}{j\brace i} g_j\\ h_i=\sum_{j\ge i} \binom{j}{i}g_j \]

现在变成了钦定有 \(k\) 个基环森林,可以先钦定 \(k\) 个环,然后所有环外点任意连,即环外点 \(x\) 的连法的和就是 \(x+\sum_{i=1}^{n}a_i\),环上的边权仍然是 \(a_j+[j\le i]\),将他写成 \((a_j+1)-[j>i]\)

再考虑组合意义,类似二项式定理,每次在前后选一项,若我们连续一段选了后面的项,就对应了一条编号递增的链,也就是对所有段方案计算,段头的贡献为 \(a_j+1\),其他的贡献为 \(-1\),再将链拼成若干个环,这就是第一类斯特林数。

那么现在直接 dp 算,设 \(f_{i,j}\) 表示考虑编号前 \(i\) 个点,拼成了 \(j\) 条链的权值和:

  • \(i\) 单独成一条链,链头贡献为 \(a_i+1\)\(f_{i,j}\leftarrow f_{i-1,j-1}(a_i+1)\)
  • 接在某条链后面,贡献 \(-1\)\(f_{i,j}\leftarrow f_{i-1,j}\times j\times (-1)\)
  • 放在环外,贡献 \(i+\sum_{j=1}^{n}a_j\)\(f_{i,j}\leftarrow f_{i-1,j}(i+\sum_{j=1}^{n}a_j)\)

于是时间复杂度 \(\mathcal O(n^2)\)

AT_agc050_f [AGC050F] NAND Tree

AT_agc039_f [AGC039F] Min Product Sum

不妨将乘法组合意义化,令一个矩阵 \(b\),要求 \(b_{x,y}\le \min(\min_{i=1}^{n}a_{i,y},\min_{j=1}^{m}a_{x,j})\)

\((a,b)\) 方案数。

\(x_i,y_j\) 分别为行列最小值,则对于 \(a_{i,j}\) 可以填 \([\max(x_i,y_j),k]\)\(b_{i,j}\) 可以填 \([1,\min(x_i,y_j)]\)

需要容斥枚举几行几列的最小值大于设定值。

然后 dp,从小到大确定 \(x_i,y_j\),设 \(f_{t,i,j}\) 表示用了 \([1,t]\),考虑了 \(i\)\(j\) 列,\(a\) 填了 \(i\)\(j\) 列的交,\(b\) 填了 \(i\)\(j\) 列的并的方案数。

转移考虑枚举填 \(t\) 的 $\ge $ 的行列数,\(>\) 的行列数:

\[f_{t,i+p+u,j+q+v}\leftarrow (-1)^{u+v}\binom{n-i}{p,u}\binom{m-j}{q,v}(k-t+1)^{iq+pj+pq}(k-t)^{iv+pv+uj+uq+uv}t^{(p+u)(m-j)+(n-i)(q+v)-(p+u)(q+v)}f_{t-1,i,j} \]

注意到 \(p,q,u,v\) 可以分步转移。

P8978 「DTOI-4」中位数

好题!!!

二分答案。

操作 \(k\) 次,尽量删去所有 \(0\)

区间 \(1\) 个数 \(>\) \(0\) 个数才行。

无相交,只有包含,且小的先操作。

若当前可操作 \(A\) 包含 \(B\),则只操作 \(A\) 更优。

每次操作对于 \([l,r]\) 一定可以调整让 \(r\) 取到最大。

这样就有一个推论:若 \(I\ne [1,n]\),则 \((1)[I]=(0)[I]+1\),则有 \(|I|=(1)[I]+(0)[I]=2(1)[I]-1\)

操作是 \(\mathcal O(\log n)\) 级别。

操作区间不会不相交:

即证两两包含。

即证相邻后面包含前面。

\([l_m,r_m]=[1,n]\) 不劣。

考虑最后两个不相交的区间 \([l_i,r_i],[l_{i+1},r_{i+1}]\)

一定可以找到最小的 \(j\in (i+1,m]\),使得 \([l_i,r_i]\)\([l_j,r_j]\) 包含,则操作 \([i+1,j-1]\) 都不包含 \(i\)

但是 \([i+1,j]\) 之间相邻的后面包含前面。

\(|l_i,r_i|\ge |l_{j-1},r_{j-1}|\),则取消 \([i+1,j-1]\) 的操作,插入一个操作 \(I\) 包含 \(I_i\),且被 \(I_j\) 包含,则 \(I\) 包含 \(0\) 的数量 \(\ge |I_i|-1\ge |I_{j-1}|-1\),而 \(I_{i+1}\sim I_{j-1}\) 中消去 \(0\) 的数量显然不超过 \(|I_{j-1}|-2\),故调整后消去 \(0\) 数量更多,更优。

否则,取消 \(I_i\),在 \(j-1\) 后插入一个操作 \(I\) 包含 \(I_{j-1}\),且被 \(I_{j}\) 包含,分析同理。

至此,首先有 dp,设 \(f_{i,l}\) 表示最大的 \(r\) 使得 \(i\) 次操作后 \([l,r]\) 全为 \(1\)

转移:

\[f_{i+1,l'}\leftarrow r[l'\le l,S([l',l-1])+(f_{i,l}-l+1)+S([f_{i,l}+1,r])>0]\\ [l'\le l,S_{l-1}-S_{l'-1}+(f_{i,l}-l+1)+S_r-S_{f_{i,l}}>0] \]

\(v(l,r)\) 表示区间 \(0\) 个数,\(c(l,r)=\max_{i\in [l,r],f_i\in[l,r]} v(i,f_i)\)

则条件可以简化为 \(s_r-s_{l'-1}+c(l',r)>0\)

注意到 \(a_{f_i+1}=0\)

考虑 \(l\) 的选取,注意到若 \(l_1<l_2,s_{l_1-1}\le s_{l_2-1}\),则 \(l_2\) 无用,因为操作 \(l_2\) 的时候调整到 \(l_1\) 更优,所以 \(f_{i,?}\) 只需要考虑前缀最小值的点。

我们可以通过确定 \([i,f_i]\) 就能找到最优的 \(s_r\),显然是后缀 \(\max\)

\(p<q,f_{i,p}>f_{i,q}\),则 \(q\) 无用。

更近一步,若 \(p<q,v(p,f_{i,p})>v(q,f_{i,q})\),则 \([q,f_{i,q}]\) 无用。

从后往前处理 \(l'\),维护一个单调栈,如果有区间更靠后且权值更小,则弹出。

然后考虑剩下栈中的数,\(s\) 是单调减的,而如果栈顶不合法,那么对于更前的 \(l'\),这个区间也不合法(因为更前的 \(s\) 更大,也是不合法的),弹出即可。

于是时间复杂度 \(\mathcal O(n\log^2 n)\)

[P10787 NOI2024] 树的定向

P8968 觅光 | Searching for Hope (hard ver.)

[P11699 ROIR 2025] 酸雨

[P8499 NOI2022] 挑战 NPC Ⅱ

posted @ 2025-06-14 10:31  蒟蒻orz  阅读(97)  评论(0)    收藏  举报