
我要自学网网站,响应式网站 cms,国外销售网站,营销咨询报告本系列最后一篇,NOI加油!P15166 [SWERC 2022] Parmigiana With Seafood
link
呜呜呜好神奇的题。
考虑二分答案,我们把 \(\ge mid\) 的点标记为 \(1\),\(mid\) 的点标记为 \(0\),先手只需要选择任意一个 \(1\…本系列最后一篇,NOI加油!P15166 [SWERC 2022] Parmigiana With Seafood
link
呜呜呜好神奇的题。
考虑二分答案,我们把 \(\ge mid\) 的点标记为 \(1\),\(mid\) 的点标记为 \(0\),先手只需要选择任意一个 \(1\) 点即可获胜,而后手选择完所有 \(1\) 点获胜。
我们来刻画一下先手/后手获胜的条件。如果有一个 \(1\) 点是叶子节点那么先手直接获胜了。否则后手在进行一次操作后不能使任何一个 \(1\) 点成为叶子节点,那么我们考虑任意一些 \(1\) 点集合所形成的虚树,这个虚树中如果有叶子结点为 \(1\) 点,我们再随便加入一条一个端点为这个 \(1\) 点的边。我们发现拆掉这个虚树的任意一个叶子节点,都会导致一个 \(1\) 点成为叶子节点。如果 \(siz_{tree}\not\equiv n \pmod 2\),那么此时后手操作,之后先手一定可以选一个 \(1\) 点,后手就输了。于是我们只需要判断是否存在这样的虚树满足 \(siz_{tree}\not\equiv n \pmod 2\) 即可。\(n\bmod 2=0\),那么一个 \(1\) 的单点就符合条件,下文只讨论 \(n\bmod 2=1\) 的情况。
存在 \(1\) 点 \((u, v)\),\(\operatorname{dis}(u, v)\bmod 2=1\),那么 \((u, v)\) 形成的虚树满足条件
存在 \(1\) 点 \((u, v, w)\),它们的中心为 \(x\),\(u,v,w\) 到 \(x\) 的距离都是偶数,那么 \((u, v, w)\) 形成的虚树满足条件。可以证明上面三条囊括了所有情况。此时我们不需要再二分答案,直接维上面几种情况 \(\min(u, v)\) 或 \(\min(u, v, w)\) 的最大值即可。另外我们发现第二种情况 \((u, v)\) 中有 \(u=n\) 或 \(v=n\),第三种情况中有 \(u,v,w,x\) 中一个为 \(n\),否则可以证明一定不优。那么容易 dfs 做到 \(O(n)\)。
P11346 [KTSC 2023 R2] 会议室 2
link
考虑最小代价,我们从小到大删除每个连通块,并保证在删每个连通块的过程中不会分裂这个连通块即可,则总方案树即为删除每个连通块的方案数 乘上 大小相同的连通块任意排列的方案数。
考虑对于一个连通块计算删除他的方案数。删除不好做,考虑时间倒流,我们每次插入一个区间,要求插入的区间与已经插入的区间的并 \([l, r]\) 一直有交。
刻画那些对当前区间的并 \([l, r]\) 有影响的线段 \(s_1,s_2,\dots ,s_k\),那么对于一条对区间并没有影响的线段 \(i\),我们需要在当前区间的并包含 \([l_i, r_i]\) 后加入它,也就是找到第一个时刻 \(p_i\),加入 \(s_j\) 后可以加入 \(i\)。
这个形式类似于拓扑序,连边 \(s_i\to s_{i+1}\),以及 \(s_{p_i}\to i\),我们发现这个 DAG 形成了叶向树,而 \(s_i\) 的子树大小为 \(n-v_{i-1}\),其中 \(v_i\) 为加入 \(s_i\) 后被当前区间并包含的线段个数。除了 \(s\) 内的点的子树大小都为 \(1\),所以固定一个 \(s\) 拓扑序个数即为 \(\dfrac{(n-1)!}{\prod_{i=1}^{k-1} (n-v_i)}\)。
那么 dp 记录 \(f_{l, r}\) 表示当前区间的并为 \([l, r]\),每次枚举一个新加入的区间 \(i\) 做到 \(O(n^3)\);前缀和优化 dp 做到 \(O(n^2)\)。
P11346 [KTSC 2023 R2] 会议室 2
link
考虑最小代价,我们从小到大删除每个连通块,并保证在删每个连通块的过程中不会分裂这个连通块即可,则总方案树即为删除每个连通块的方案数 乘上 大小相同的连通块任意排列的方案数。
考虑对于一个连通块计算删除他的方案数。删除不好做,考虑时间倒流,我们每次插入一个区间,要求插入的区间与已经插入的区间的并 \([l, r]\) 一直有交。
刻画那些对当前区间的并 \([l, r]\) 有影响的线段 \(s_1,s_2,\dots ,s_k\),那么对于一条对区间并没有影响的线段 \(i\),我们需要在当前区间的并包含 \([l_i, r_i]\) 后加入它,也就是找到第一个时刻 \(p_i\),加入 \(s_j\) 后可以加入 \(i\)。
这个形式类似于拓扑序,连边 \(s_i\to s_{i+1}\),以及 \(s_{p_i}\to i\),我们发现这个 DAG 形成了叶向树,而 \(s_i\) 的子树大小为 \(n-v_{i-1}\),其中 \(v_i\) 为加入 \(s_i\) 后被当前区间并包含的线段个数。除了 \(s\) 内的点的子树大小都为 \(1\),所以固定一个 \(s\) 拓扑序个数即为 \(\dfrac{(n-1)!}{\prod_{i=1}^{k-1} (n-v_i)}\)。
那么 dp 记录 \(f_{l, r}\) 表示当前区间的并为 \([l, r]\),每次枚举一个新加入的区间 \(i\) 做到 \(O(n^3)\);前缀和优化 dp 做到 \(O(n^2)\)。
AT_arc165_e [ARC165E] Random Isolation
link
先进行一个经典 trick 转化,随机一个排列 \(p\),依次考虑每一个元素,如果这个元素所在的连通块 \(k\) 那么就删掉这个元素,可以证明是等价的。
刚刚看到这道题我们可能会有一个想法,对于每个点求出他被操作的概率,但是这个东西非常不好求,因为我们需要这个点所在连通块的信息才能求概率。
于是转换方向,我们发现对于一个大小 \(k\) 的连通块,他肯定会被操作一次,然后被分成若干个更小的连通块。于是我们计算每个连通块出现的概率。
记这个连通块大小为 \(n\),与这个连通块相邻的点的个数为 \(m\),我们发现出现的概率等价于在排列 \(p\) 中 \(m\) 个点都在 \(n\) 个点之前出现的概率,那么 dp 记数所有这样的连通块就完了。
P6776 [NOI2020] 超现实树
link
好玩的推性质题。
先刻画一下一个树 \(A\) 可以生成 \(B\) 的条件:\(A\) 中的每一个节点,对于 \(B\) 中的位置不能是一个空点。
\(A\) 中的每一个单儿子节点 \(u\),在 \(B\) 中不能有两个儿子。结论 \(1\):如果存在一个深度为 \(maxh\) 无法被生成,那么存在无穷个树无法被生成。
结论 \(2\):如果我们仅考虑条件 \(1\) 的话,我们只需要考虑每一个形态为链的、深度为 \(maxh\) 树能否被生成。
结论 \(3\):加上条件 \(2\),我们只需要考虑每一个形态为链,并将链上若干个点添加另一个叶子节点形成的深度为 \(maxh\) 的树能否被生成。
总共 \(2^{2maxh}\) 个需要被考虑的树,我们可以考虑 dfs 的形式,每次在现有的树上加入一个左儿子并向左儿子递归 / 加入一个右儿子并向右儿子递归 / 加入左右儿子并向其中之一递归,每次判断给定的 \(m\) 棵树是否与当前递归到的树同构即可。复杂度线性。
P7740 [NOI2021] 机器人游戏
link
考虑容斥,枚举子集 \(S\) 表示 \(S\) 内的 \(p\) 都可以作为起点的方案数,\(O(2^n n^2m)\)。
枚举右端点 \(r\),我们发现如果 \(2r\le n\),那么此时可能的集合不超过 \(2^{n/2}\) 个。否则所有 \(c_in/2\) 的机器人都爆炸了,他们的输入输出都只有一种方案,考虑 dp,从小到大枚举列 \(i\),我们只需要记录前 \(n-r\) 个点有没有被选为起点即可。
现在我们已经可以做到 \(O(2^{n/2} nm)\) 了,瓶颈在于我们每次 dp 枚举列 \(i\) 时,需要对 \(m\) 个机器人都计算其方案数,我们发现这个可以用 bitset 优化,做到 \(O(\dfrac{2^{n/2}nm}{\omega})\)。
P8497 [NOI2022] 移除石子
link
先解决判定性问题:给定一个石子序列,如何判定可以取完。
sol:考虑 dp,\(f_{i, x, y}\) 表示考虑了 \([1, i]\) 的石子堆,\(i-1\) 开始的操作二有 \(y\) 个,\(i-2\) 之前有 \(x\) 个。通过对拍/打表可以发现结论:只需保留 \(x\le 2\land y\le 2\land x+y\le 3\) 的状态,以及 \(a_i\gets \min(a_i, 4)\) 不会影响结果。
现在加入可以放 \(K\) 个石子的限制,继续考虑判定方法:
声称绝大多数情况下放 \(=K\) 个石子和 \(\le K\) 个石子等价。首先放 \(=K\) 个石子和放 \(\le K-2\) 个石子或者放 \(K\) 个石子等价。考虑放 \(K-1\) 个石子的情况,如果他进行了操作二并且存在一个操作二没有同时操作所有的石子,或者进行了任意一次操作一,那么再放一个石子也能解决。否则其进行的所有操作皆为对 \(n\) 个石子一起操作二,那么这些石子堆的石子数必然全为 \(0\) 或全为 \(1\) 且 \(n=3\),还要满足 \(K=1\),判一下就好了。
于是我们现在改 dp 状态为 \(f_{i, x, y}\),至少放 \(K\) 个石子中的多少颗才合法。
现在我们解决了判定问题,记数问题考虑把他放到自动机上,状态 \(S\) 记录 \(8\) 种 \(f_{*, x, y}\) 的取值,打个表发现只有几千种,那么直接做即可。
P8500 [NOI2022] 冒泡排序
link
首先考虑 A 性质。将题意转化为将一些位置钦定为 \(1\),并且存在一些区间 \([l, r]\) 要求 \([l, r]\) 内至少有一个 \(0\)。先贪心填完所有位置(如果这个位置填 \(1\) 逆序对更少就填 \(1\),否则填 \(0\))。此时有一些限制未能满足,我们需要找到 尽可能少的、尽可能靠左的 \(0\) 改成 \(1\)。可以 \(O(n^2)\) dp,但存在一个经典贪心:把区间按左端点降序排序,每次判断每个区间,如果区间内没有 \(0\) 就把左端点改成 \(0\)。
B 性质。把确定的位置填完后,我们发现剩下的数直接贪心就是对的,因为贪心的结果一定满足可以自由填的位置值升序。用线段树维护区间加最小值即可。
正解就是把两个性质拼起来。预处理 \(b_i\) 表示最终的 \(a_i\ge b_i\)。再对于每种值不同的限制分别做,我们把这些限制区间按照 A 性质的处理方法,钦定一些点 \(=b_i\) 来满足所有的限制。之后对于还没有确定的点,我们从前往后贪心地钦定满足 \(\ge b_i\) 的会产生最小逆序对的值。
P10789 [NOI2024] 登山
link
dp \(f_u\) 表示从 \(u\) 点出发的方案数。下文中 \(l_i, r_i\) 表示一个点可以跳到的深度区间,\(h_i\) 表示要求之后跳到的点深度 \(\le h_i\)。
转移:\(f_u=\sum_v \sum_w [dep_w\in [l_v, \min(r_v, \min_{z\in \operatorname{path}(u, v)}h_z)]] f_w\),暴力枚举 \((u, v)\),并维护 \(s_i\) 表示目前 dfs 到 \(u\),\(u\) 的深度为 \([1, i]\) 的祖先的 \(f\) 之和,先父亲再儿子地 \(f_u\),容易做到 \(O(n^2)\)。
。 \(s_{l_v-1}\) 差分掉,我们要类似半在线维护 \(\sum buc_{u, i} s_i\),其中 \(buc_{u, i}=\sum [\min(r_v\min_{z\in \operatorname{path}(u, v)}h_z)=i]\)。
单独维护 \(buc_{u, i}\) 是容易的。dfs 一遍,对于一个节点 \(u\),先得到其所有子结点的答案,钦定其中 \(siz\) 最大的作为重儿子并让其他节点向他合并。
现在的问题是我们维护 \(buc\) 的顺序和维护 \(s\) 的顺序是反的,于是先做一遍 dfs 处理完 \(buc\),然后第二遍 dfs 时启发式分裂 \(buc\)(可以理解为对第一遍得到的结果时间倒流) 并维护对应的 \(\sum buc_{v, i}s_i\)。需要用 map 维护 \(buc\) 数组所以最后的时间复杂度为 \(O(n\log^2 n)\),空间复杂度 \(O(n\log n)\)。
AT_arc221_b [ARC221B] Two-Powered Sum
link
考虑时光倒流,对于一个集合 \(S\),如果它可以作为最后一个被操作的集合,那么 \(S\) 满足 \(\forall i \in S,a_i=S\),我们删掉这样的 \(S\) 后接着做,接下来选中的集合 \(T\) 需要满足 \(\forall i,j \in T, a_i=a_j \land T \in a_i \in S\),也就是 \(S\) 内已经删掉的元素可以随便填,但需要满足 \(T\) 内所有元素的 \(a\) 相等。
这个类似 DAG 容斥,每次我们枚举同时删掉 \(k\) 个集合并带有 \((-1)^{k+1}\) 的系数,用 dp 维护一下即可。
CF2222G Statistics on Tree
link
对于一条路径 \((u, v)\),令 \(c=\operatorname{lca}(u, v)\),则删掉 \((u, v)\) 后最大连通块大小 \(f(u, v)\) 为 \(siz_u, siz_v,n-siz_{fu}-siz_{fv},siz_x-siz_y\) 五类的 \(\max\)。其中 \(fu,fv\) 表示 \(c\) 在 \(u,v\) 方向的第一个儿子,\((x, y)\) 表示链上相邻的两个点。
以重心 \(rt\) 为根。如果 \(c\neq rt\),那么 \(f(u, v)=n-siz_{fu}-siz_{fv}\)。在 \(c\) 处统计答案,我们发现对于每个儿子 \(u\) 只有 \(siz_u\) 的值是重要的,开个桶同时处理所有相同的 \(siz_u\),并且双循环枚举,根据经典结论这个是 \(O(n\log n)\) 的。
对于 \(c=rt\) 的情况,定义 \(son_u\) 表示 \(u\) 的重儿子,如果 \(fu\neq son_{rt} \land fv\neq son_{rt}\) 那么 \(f(u, v)=n-siz_{fu}-siz_{fv}\)。否则令 \(fu=son_{rt}\),此时 \(f(u, v)=\max(val_u, val_v, n-siz_{son_{rt}}-siz_{fv})\),其中 \(val_u\) 表示 \((rt, u)\) 路径上所有相邻的 \((x, y)\) 的 \(siz_x-siz_y\) 的最大值。这是一个简单一维偏序形式,排序后容易统计。
总复杂度 \(O(n\log n)\),用到最高级的算法是快速排序。
CF1864G Magic Square
link
我们定义 \(r_i\) 为第 \(i\) 行移位的距离, \(c_i\) 为第 \(i\) 列移位的距离。
一个元素如果在 \(A,B\) 中他的行或列相等,那么他的路径就被确定了,我们可以以此确定这个元素所在行/所在列的移位。否则他经历了两次移位。
我们发现对于任意一行 \(i\) 和任意一列 \(j\),一定有一个元素同时经历了 \(r_i\) 的移位和 \(c_j\) 的移位,而题目中保证任何两个经历两次移位的元素偏移量不相等。如果存在 \(i,j,k,r_i\neq 0,c_j=c_k\neq 0\),那么题目条件就不被满足了,所以如果存在 \(c_i\neq 0 \land c_j\neq 0\),那么所有非 \(0\) 的 \(c_i\) 和所有非 \(0\) 的 \(r_j\) 互不相等。
这是一个非常强的性质。对于任意一行 \(i\),如果存在一个元素在 \(A,B\) 中都在第 \(i\) 行,那么 \(r_i\) 就被确定了。否则所有列都进行了移位,此时根据上述性质一定有 \(\forall i,r_i=0\)。 这个 case 是容易计算答案的。
否则我们可以确定所有 \(r_i,c_j\) 的取值。由于 \(r_i\) 互不相等 \(c_j\) 互不相等,任何一个需要经历两次移位的元素,他的路径是唯一的。我们把操作顺序看成 DAG 中取一个 DAG 序,对于 \(i,j,r_i\neq 0,c_j\neq 0\),行 \(i\) 和列 \(j\) 都存在一条表示先后关系的有向边。
这是一个非常特殊的 DAG。如果开始时行 \(i\) 的入度为 \(0\),我们发现所有的列都有一条行 \(i\) 连向他的边,也就是说现在所有入度为 \(0\) 的点都是行,且这些行操作完后才会出现新的入度为 \(0\) 的点。那么拓扑序个数就是若干个阶乘的乘积,容易 \(O(n^2)\) 计算。
CF2201F2 Monotone Monochrome Matrices (Hard Version)
link
把每一行黑色的位置构成的集合记为 \(S_i\)。
容易发现题目条件等价于,任意的 \(S_i,S_j\) 互相包含,即 \(|S_i\bigcap S_j|=\min(|S_i|, |S_j|)\)。
我们发现 \(|S_i\bigcap S_j|\le \min(|S_i|, |S_j|)\),所以条件等价于 \(\sum |S_i\bigcap S_j|=\sum \min(|S_i|, |S_j|)\),左右两边都是容易计算的。\(O(n+q)\)。
CF1603E A Perfect Problem
link
确实是,perfect problem。
把 \(a\) 从小到大排序,取 \(a\) 的每个前缀判断是否为好的序列与原意等价。
记 \(s=a_1\),\(b_i=a_i-s\),那么可以将条件改写成 \(\forall i, s\times (s+b_i-i)\ge \sum_{j=1}^i b_j\)。我们发现 \(a_n=s+b_n\le n+1\),那么有 \(\sum b_i\le s\)。
另外有 \(b_i\ge \max(0, i-s)\),联立上面两个柿子得 \(s\ge n-\sqrt{2n}\),那么我们枚举 \(s\) 后按位 dp,\(f_{v, i, s}\) 枚举到 \(b_i=v\) 且 \(\sum_{j=1}^i b_j=s\),转移是容易的。我们发现需要枚举的 \((s, v)\) 总量级是 \(O(n)\) 的,于是总复杂度 \(O(n^3\log n)\)。
CF2196D Double Bracket Sequence
link
如果一对括号在原串中就匹配了,我们把它删去了肯定不劣,剩下 \(\texttt{]][[}\) + \(\texttt{))((}\) 类似的串。
设目前留下来的串长度为 \(len\),修改次数至少是 \(len/2\),因为一次修改至多产生一个合法的括号。
考虑一种接近下界的构造:我们把 \(\texttt{)}\) 和 \(\texttt{]}\) 放在一起匹配,把 \(\texttt{(}\) 和 \(\texttt{[}\) 放在一起匹配。如果两种括号数量和是偶数那么 \(len/2\) 次匹配完了;否则剩下一个单独的左括号和一个单独的右括号,如果左括号在左,再一次操作即可匹配这两个括号,那么 \(len/2\) 次匹配完了;否则这一对括号还需要额外一次操作,总操作次数 \(len/2+1\),我们选择剩下最左边的左括号和最右边的右括号进行判断。感性理解这样就已经最优了。
QOJ14980. Embedding Trees
link
\(r_k\) 的形态,应该为两棵深度为 \(k\) 的完全二叉树,通过两个根拼起来的样子。
我们把这个 \(r_k\) 所有不同的子树提出来,发现只有 \(2k-1\) 种形态,分成两类:深度 \(\le k\) 的完全二叉树 一个 \(r_k\) 减去一个深度 \(k\) 的完全二叉树。我们把他们按大小标号为 \(1\dots 2k-1\)。
我们先用经典套路,将答案转化为对于每个 \(r_k\),计数有多少连通块包含它。
由此考虑树形 dp。对于每个子树,\(f_{u, i}\) 记录 \(u\) 能被匹配的最大子树编号为 \(i\)。这里可以分讨证明,记录那个能被匹配的子树最大的一定是最优的。然后考虑转移 \(f_u\),分成几种情况:\(u\) 所有儿子 \(v\) 的状态均 \(k\),那么转移到儿子 \(v\) 的次大值。
存在 \(\ge 3\) 个儿子 \(v\) 的状态 \(\ge k\),可以证明这个时候直接可以构成 \(r_k\)。
否则存在 \(1\) 或 \(2\) 个儿子的状态 \(\ge k\),如果有两个把较小那个变成 \(k\) 的状态;接下来令 \(k\) 的状态为 \(2k-x\),如果存在另一个 \(\ge x-1\) 的状态则转移到 \(2k-(x-1)\);否则把 \(2k-x\) 当作 \(x+1\) 进行转移。时间复杂度 \(O(n\log^2 n)\),据说可以分析到 \(O(n \log n)\)。
CF1942F Farmer John's Favorite Function
link
我们对 \(f(i)\) 全部向下取整是不会有任何影响的,先将 \(f(i)\) 的定义改成 \(f(i)=\lfloor \sqrt{f(i-1)+a_i} \rfloor\)。
可以想到一个有精度误差的做法:如果我们要求 \(f(i)\),直接把 \(i-\log\log V\)前面的数当作 \(0\) 来计算,最后的结果不会差超过 \(1\)。另外还有一个没有误差的做法,二分并判断 \(f(i)\ge x\),我们有 \(f(i)\ge x \iff a_i\ge x^2 \lor f(i-1)\ge x^2-a_i\),那么可以递归地检查 \(f(i)\ge x\) 是否成立。
把两个做法合起来,我们考虑每 \(\sqrt n\) 个数 个数分成一块,每次修改时重构这个块,把块外的数都当成 \(x0\) 算出块右端点的值 \(x\),并维护当前一个块最后一个位置的 \(f\) 值 \(\ge lim\) 时,当前块最后一个位置的 \(f\) 值变为 \(x+1\)。询问时暴力扫一遍所有的块即可,\(O(n\sqrt n)\)。
实际上我们每个块维护的 \((x, lim)\) 是满足结合律的,于是可以在底层每 \(\log\log V\) 个数分块,然后用线段树维护 \((x, lim)\) 信息,时间复杂度 \(O(n+q(\log n+\log\log V))\)。
CF2057F Formation
link
假如我们想要让 \(a_i\) 变成最后的最大值 \(x\),那么要在 \(i\) 处花费 \(\max(0, x-a_i)\),在 \(i-1\) 处花费 \(\max(0, \lceil x/2 \rceil - a_{i-1})\),……, \(i-t\) 处花费 \(\max(0, \lceil x/2^t\rceil - a_{i-t})\),总共影响最多 \(\log V\) 个值。
上式中 \(\lceil x/2^i\rceil - a_{i-i}0\) 的 \(i\) 构成一个前缀,这个前缀的长度 \(t\) 固定时,对于每一个 \(i\) 合法的 \(x\) 构成一个区间,贡献可以写成 \(\sum_{i=0}^t \lceil x/2^i\rceil-\sum_{j=i-t+1}^i a_j\) 的形式,我们想要最小化这个柿子,也就是要最大化 \(\sum_{j=i-t+1}^i a_j\)。
如果原题让我们算在 \(mx=x\) 的情况下的最小花费,那么可以扫描线 \(x\),对于 \(\log V\) 个 \(t\) 维护对应的最优的 \(i\),可以在 \(O(\log V)\) 的复杂度下算出每个答案。
现在我们要在固定花费的情况下最大化 \(mx\),我们可以对于每一组 \((i, t)\) 得到其花费对应的值域区间,同样扫描线,二分判断花费为 \(k\) 的情况下 \(mx\) 是否 \(\ge x\)。\(O(n\log^2 V)\)。
假设集合 \(U\) 内的点是蓝眼睛,我们要求其第一次开枪的时间 \(f_U\)。
对于某一个 \(u\in U\) 来说,在什么时候才能确定自己是蓝眼睛呢?假设它不是蓝眼睛,枚举对于 \(u\) 来说所有可能的情况 \(S\)(即 \(u\) 看不到的人,可以是蓝眼睛可以是红眼睛),求出所有这样的 \(S\) 的开枪时间 \(\max f_S\),那么 \(u\) 开枪的时间就是 \(\max f_S +1\)。感性理解一下 \(S\) 取最大的一定最优,如果 dp 到环那么就是无穷。\(f_S\) 的答案就是所有 \(u\) 的答案之 \(\min\)。
#76. 【UR #6】懒癌
link
假设集合 \(U\) 内的点是蓝眼睛,我们要求其第一次开枪的时间 \(f_U\)。
对于某一个 \(u\in U\) 来说,在什么时候才能确定自己是蓝眼睛呢?假设它不是蓝眼睛,枚举对于 \(u\) 来说所有可能的情况 \(S\)(即 \(u\) 看不到的人,可以是蓝眼睛可以是红眼睛),求出所有这样的 \(S\) 的开枪时间 \(\max f_S\),那么 \(u\) 开枪的时间就是 \(\max f_S +1\)。感性理解一下 \(S\) 取最大的一定最优,如果 dp 到环那么就是无穷。\(f_S\) 的答案就是所有 \(u\) 的答案之 \(\min\)。。
来刻画这个 dp 的过程究竟在干什么,如果 \(i\) 看不见 \(j\) 那么连边 \(i\to j\),把整张图的环全部删掉,剩下一个 DAG,那么相当于初始我们有一个染黑的集合 \(S\),每次我们把一个别的黑点不可达的黑点删掉(为了保证 dp 是,并把他的后继全部设为黑点,那么答案即为存在过的黑点的个数之和,唉你发现这个不是经典可达性问题吗,那直接做完了。
CF2122E Greedy Grid Counting
link
如果向右的路径更大那么向右一定更优;出现贪心路径不是最大路径的只有可能是在当前点向下了,但是后面向右更优。
形式化的,存在一对 \((i, j)\),满足:\(a_{1, i}a_{0, i+1}\)
\(\sum_{k=i}^{j-1} a_{1, k}\sum_{k=i+1}^{j} a_{0, k}\)。移项,令 \(b_i=a_{0, i+1}-a_{1, i}\),相当于 \(b_i0\) 且 \(b_i\) 开头的最大前缀和 \(0\) 那么就不合法了。考虑 dp,记 \(f_{i, j}\) 表示 dp 到 \(b_i\),最大前缀和为 \(j\)。转移考虑枚举 \(b_i\) 正负关系,如果 \(b_i0\),要求目前的最大前缀和 \(\le -b_i\),那么我们可以时时刻刻对 \(f_{i, j}\) 的第二维对 \(m\) 取min,最后的复杂度是 \(O(nm^2)\)。
CF2239D Hunting the Beast
link
显然每个集合的贡献是相等的,转而计算 \(\{1,\dots,m\}\) 在多少个图当中合法。
一个图合法的条件为:对于每一个叶子 \(i\),\(i\le m\)。
对于每一个纯环,要求纯环中至少存在一个点 \(x\) 满足 \(x\le m\)。考虑容斥,钦定有 \(i\) 个叶子和 \(j\) 个纯环不满足条件,那么容斥系数是 \((-1)^{i+j}\)。
钦定 \(i\) 个叶子不合法,以及 \(j\) 个点构成纯环不满足条件,计算此时的方案数。记 \(j\) 个点构成纯环不满足条件的方案数为 \(f_j\),那么总方案数为 \((n-i-j-1)^{n-i-j}(-1)^i(n-i-j)^i f_j {n-m \choose i+j}{i+j\choose i}\)。
考虑先计算 \(g_i\) 表示可以连自环的情况下 \(i\) 个点的总系数,\(g_0=1,g_1=-1\),对于 \(i\ge 2\) 的 \(g_i\),我们发现交换 \(1,2\) 的出边,环的奇偶性改变,所以此时 \(g_i=0\)。那么 \(f_i=\sum_j g_{i-j} (-1)^{2j} {i\choose j}=1-i\)。打表也可以获得这个结论。
枚举 \(k=i+j\),那么答案可以写成 \(\sum_k {n-m\choose k}(n-k-1)^{n-k}\sum_i {k\choose i} (1-i)(n-k)^{k-i}\),后面的柿子展开化简是容易的,于是我们做到了 \(O(n\log n)\) 或 \(O(n)\)。
P12489 [集训队互测 2024] 线段树与区间加
link
这个 \(a_i\) 非常不好维护,我们发现 \(a_i=\sum_{j\in subtree(i)} lzy_j\),于是把 \(a_i\) 的贡献转到 \(lzy_j\) 上面。
现在的操作形如,让一些点 \(u\),使他们的 \(lzy_u\) 变成 \(\sum_{w\in anc(u)} lzy_w+x\),并清零所有的这样的 \(w\)。
把 \(lzy_u\) 变成祖先链上的 \(lzy_w\) 之和,那么此时我们消除了 pushdown 的影响,相当于每次给一些点 \(u\),令 \(tag_u\gets tag_u+x\),并让这些 \(u\) 的祖先赋值为 \(0\)。
欸这个时候我们发现所有的操作都可以写成二维偏序的形式,kdt 一下就做完了。\(O(n\sqrt n)\)。似乎由于信息没有交换律不能 cdq。
CF1863G Swaps
link
把 \(a\) 放到基环树上。操作 \(u\) 相当于,让 \(u\) 的父亲连向自己,并且 \(u\) 连向 \(u\) 的父亲的父亲。
关键转化:我们把操作 \(u\) 看作标记 \((u, a_u)\) 这条边,并不对图的形状做出改变。保证没有两条标记的边他们的终点是相同的。对于标记完一些边后的图,对于一个点 \(u\),如果存在一条指向 \(u\) 的边被标记了那么 \(a_u=u\);否则 \(a_u\) 等于从 \(u\) 开始往祖先走第一个没有被标记的边的终点。
那么一颗树+一个只有一个点的环的图,其答案就为 \(\prod_{u\neq rt} (d_u+1)\),\(d_u\) 表示 \(u\) 的入度。
对于存在大小为 \(c\) 的环的情况,我们发现如果环中 \(c-1\) 条边都被标记了,那么这 \(c\) 个环上的点的边都只向了自己,我们也不能让 \(c\) 条边同时标记。那么对于一个环,其方案数就是 \(\prod(d_u+1)-\sum(d_u)\)。
那么这个图的方案数即为,\((\prod_{u\in cyc} (d_u+1)-\sum_{u\in cyc} d_u)(\prod_{u\notin cyc} (d_u+1))\)。
#1094. 【UNR #10】麦田
link
如果 \(a_i=a_{i+1}\),那么这两个点之后再也不会动了;所以每个点最多上升一次。
对于每个可能会上升的点,找到他们上升所需要用到的区间 \([l_i, r_i]\),那么当 \(ql\le l_i\le r_i\le qr\) 时这个点会上升。扫描线即可 \(O(n\log n)\)。
更进一步,可以发现 \(l_i, r_i\) 单调不降,那么双指针即可,\(O(n)\)。
#1095. 【UNR #10】分披萨
link
令每个人的区间内颜色个数为 \(x\)。
假如确定了所有的 \(a_i\),考虑如何 check 合法性。枚举 \(x\),枚举 \(i\in 1\dots k\),对于第 \(i\) 个人,我们维护其区间可能右端点的最小值 \(mn_{x, i}\),和右端点可能最大值 \(mx_{x, i}\)。最后如果有 \(mn_{x, k}\le n \land mx_{x, k}=n\),那么 \(x\) 就是合法的。
容易发现 \(mx_{x, i}mn_{x, i+1}\),所以对于一个确定的 \(a_i\),至多只有一个 \(x\) 合法。
因此枚举 \(x\) 计数有多少个区间满足 \(mn_{x, k}\le n \land mx_{x, k}=n\)。发现一件事是当 \(mx_{x, k}=n\) 时一定有 \(mn_{x, k}\le n\),所以我们可以考虑容斥,满足 \(mn_{x, k}\le n\) 的方案数减去 \(mx_{x, k}n\) 的方案数就是最终答案。
现在问题被我们拆成了两部分。对于两部分分别进行 dp,即可做到 \(O(n^4)\)。
#1096. 【UNR #10】字符串
link
一步最重要的观察:考虑取一个 \(k\),当 \(k\in [\frac{r-l+1} 2, r-l+1]\) 时,\(s[l, r]\) 与 \(\operatorname{rev}(s[l, r])\) 的大小关系,等于 \(s[l, l+k-1]\) 与 \(\operatorname{rev}(s[r-k+1, r])\) 的大小关系。于是对于每一组 \([l, r]\) 取最大的满足条件的 \(2\) 的幂次。
具体地,枚举所有不同的 \(k\),类似后缀数组求出每一个 \(s[i, i+k-1]\) 和 \(\operatorname{rev}(s[i-k+1, i])\) 的大小排名。从大到小扫描线 \(s[i, i+k-1]\),并用线段树维护目前的 \(s[i, i+k-1]\operatorname{rev}(s[j-k+1, j])\) 的所有位置 \(j\),对于每一个询问 \([ql, qr]\),如果 \(qr-ql+1\ge k\),就把区间 \([ql+k-1, \min(qr, ql+k+k-2)]\) 的 hash 信息加入答案中,这样是 \(O((n+q)\log^2 n)\) 的。
考虑优化,我们发现对于每一组询问 \([ql, qr]\),最多只会有一个 \(k\) 满足询问右边界 \(\min(qr, ql+k+k-2)\) 的 \(\min\) 是取到 \(qr\) 的。而实际上其他 \(k\) 的询问区间只与 \(ql\) 有关,此类最多只有 \(n\log n\) 个本质不同的询问。因此可以优化到 \(O(n\log^2 n+q\log n)\),已经可以通过此题。