杂题集 3

\(41\sim60\)道杂题。

(完结与 2025APIO 前一日)

[AGC062B] Split and Insert

有一个排列 \(A\) 满足 \(A_i=i\ (1\leq i \leq N)\)。进行 \(K\) 次操作:

  • 任意选择一个 \(k\) ,选择排列最末尾 \(k\) 个元素,将其插入进前面 \(n-k\) 个元素。

定义所有操作的代价是 \(\sum_{i=1}^{K}k_iC_i\),其中 \(k_i\) 表示第 \(i\) 轮选择的 \(k\),求最终变为给定的排列 \(P\) 的最小代价或判无解。

\(1\le N \le 100\)


非常棒的一道题。

发现正着做非常没有头绪,正难则反。

相当于从最终的序列中每次取一个子序列出来放在最后,求最后变为 \(1\sim n\) 的序列的最小代价。

\(dp_{i,l,r}\) 表示,经过 \(i \sim k\) 轮操作后将数字 \(l\sim r\) 从小到大排序的最小代价,答案即为 \(dp_{1,1,n}\)

\[\min\{dp_{i+1,l,r},dp_{i+1,l,x}+dp_{i+1,x+1,r}+(r-x)\times c_i \} \to dp_{i,l,r} \]

初始化就是将所有本来就有序的 \([l,r]\)\(dp_{k+1,l,r}\) 设为 \(0\)

[ABC219H] Candles

\(n\) 根蜡烛,第 \(i\) 根坐标为 \(x_i\) 高度为 \(a_i\),每单位时间燃烧 \(1\) 高度。从 \(0\) 出发,每单位时间移动 \(1\) 长度,可瞬间吹灭同一位置蜡烛。求所剩蜡烛的最大总高度。

\(1\le n \le 300,1\le a_i\le10^9,-10^9\le x_i \le 10^9\)


比较明显的一种方法是令 \(dp_{l,r,t,0/1}\) 表示吹灭了 \(l \sim r\) 的蜡烛,当前时间为 \(t\),在左/右端点。但是由于 \(t\) 可以达到 \(10^9\),显然是行不通的。

思考一下,我们要满足某一方面的性质,一般有一下三种方式:

  • 直接放在状态里。
  • 作为 dp 的值。
  • 通过设计状态使得不满足条件的解一定不可能作为最优解。

将时间作为 \(dp\) 的值显然是无法求出答案的,考虑使用第三种方式。

定义 \(dp_{l,r,k,0/1}\) 表示已经经过了 \(l\sim r\) 的蜡烛,还需要吹灭 \(k\) 根蜡烛最大总高度。

转移式子显然,需要用到代价提前计算。

此时如果经过了一个没有燃烧完的蜡烛但是没有吹灭它,我们把 \(k+1\) 的情况一定是更优的,同样,如果我们选择了一个早已燃烧完的蜡烛,则贡献会加上负数,那么 \(k-1\) 的情况一定是更优的。

复杂度 \(\text O(n^3)\)

[CEOI 2016] kangaroo

\(n\) 个排成一排的位置,从 \(s\) 跳到 \(t\)\(n-1\) 且不经过重复位置且相邻两次跳跃的方向不同的方案数。对 \(10^9+7\) 取模。

\(1\le n\le 2000\)


貌似很早就看见过这个 trick 但是一直没有理解。

可以把题目转化成求满足 \(p_1=s\)\(p_n=t\) 且一个数的相邻两个数要么都比它打要么都比它小的 \(1\sim n\) 的排列 \(p\) 的数量。

考虑将数从 \(1\sim n\) 依次加入。

\(dp_{i,j}\) 表示将前 \(i\) 个数分成 \(j\) 段且每一段都满足“相邻两个数要么都比它打要么都比它小”的方案数。

考虑怎么得到 \(dp_{i,j}\)

每次添加一个数可以将其作为一个单独的新段,新段可以从 \(j\) 个空位中任意选,也就是 \(dp_{i-1,j-1}\times j\),但是由于 \(s\) 必须放在开头 \(t\) 必须放在结尾,所以实际上是 \(dp_{i-1,j-1}\times(j-[i>s]-[i>t])\)

同样可以将 \(i\) 作为桥梁连接左右两个块,因为当前 \(i\) 是最大的数,所以满足条件,加上 \(j\times dp_{i-1,j+1}\)

\(s\)\(t\) 的情况特殊处理就行了。

大脑过载

link

定义一棵树的价值为 \(\sum_{i=1}^{n-1}\sum_{j=i+1}^{n}dis(i,j)a_ia_j\),其中 \(a_i\) 表示 \(i\) 的点权,\(dis(i,j)\) 表示 \(i\to j\) 的距离,边有边权。

对于 \(i=2\sim n\) 求出以下值的最大值:

  • \(i\) 的子树中选择一个 \(x\),删除 \((i,fa_i,w_i)\) 这条边并加上 \((x,fa_i,w_i)\) 后得到的树的权值。

\(1\le n \le 10^5\)


别硬控了 4h 绷不住了。

首先考虑怎么算还没有变化时的总权值。

可以分开考虑每条边的贡献,答案就是 \(\sum w_i \times s_i \times (Suma-s_i)\),其中 \(s_i\) 表示以 \(i\) 为根的子树中 \(a\) 的和。

接下来考虑怎么求出答案。

发现产生了变化的只有在子树内和不在子树内的点的距离,就是:

\[\sum _{p\in T_i}\sum_{q \notin T_i} dis(p,q)\times a_p\times a_q=\sum _{p\in T_i}\sum_{q \notin T_i} (dis(p,x)+dis(x,q))\times a_p\times a_q \]

拆开后就可以得到:

\[\sum_{p\in T_i}a_p\times dis(p,x)\sum_{q\notin T_i}a_q+\sum_{p\in T_i}a_p\sum_{q\notin T_i}a_q\times dis(x,q) \]

发现 \(\sum_{q\notin T_i}a_q\times dis(x,q)\) 是不变的,因此只需要算 \(\sum_{p\in T_i}a_p\times dis(p,x)\sum_{q\notin T_i}a_q\) 的最大值。

这里注意 \(\sum_{q\notin T_i}a_q\) 可能是负数,所以要同时求 \(\sum_{p\in T_i}a_p\times dis(p,x)\) 的最大值和最小值。

考虑用换根的思想计算变化值。

\[\sum_{j\in(i\to x)\and j \not= i} w_j\times(s_i-2\times s_j) \]

拆开。

\[\sum_{j\in(i\to x)\and j \not= i} (w_js_i-2s_jw_j) \]

\(l_i\) 表示 \(i\)\(1\) 的距离,\(c_i\) 表示 \(i\)\(1\) 的所有 \(w_js_j\) 的和。

则原式就变为了:

\[s_i(l_x-l_i)+2(c_i-c_x)=s_il_x-2c_x+2c_i-2s_il_i \]

发现这是一次函数的形式,所以用李超线段树+树上启发式合并就行。

[AGC008F] Black Radius

给定一颗 \(n\) 个节点的树,所有点为白色,有些点可以选择。可以任选一个 \(x\),一个 \(d\),将所有与 \(x\) 距离不超过 \(d\) 的点染成黑色,求最后可能的所有染色情况。

\(1\le n \le 2\times 10^5\)


挺典的一道结论题。

考虑怎么不重不漏的统计到所有情况。

可以在所有最终图的 \(d\) 的最小的时候的 \(x\) 统计。

首先为了防止重复我们先不考虑所有点都被染色的方案,最终的时候加一就行。

\(f_u\) 表示以 \(u\) 为根的树中最深的子树,\(g_u\) 表次深的子树深度。

若所有点都是可以选择的,每个点可以计入答案的 \(d\) 区间为 \([0,\min(f_u-1,g_u+1)]\)

\(g_u+1\) 的原因在于如果取到了 \(g_u+2\) 就可以往 \(g_u\) 所在子树走一步,\(d\) 变小图形不变。

接下来想一想某些点不能被选择的情况。

同样按上面的方法考虑,每种图形在 \(d\) 最小的那个点上进行判断。

\(u\) 不能选,则一定有一个子树上的点 \(v\) 覆盖了整棵子树然后扩展到了 \(u\)。所以令 \(mi_u\) 表示 \(u\) 所有子树中最大深度的最小值,\(d\in [mi_u,\min(f_u-1,g_u+1)]\)

换根处理就行了。

领导集团问题

给定一棵 \(n\) 个点的树,每个点有点权,选出最大的一个点集使得点集中的任意两个有祖孙关系的点都满足祖先节点小于等于子孙节点。

\(1 \le n \le 2\times10^5\)


首先贪心的想,当一颗子树内选择的数的数量相同时显然点权最小的那个点越大越优。

\(f_{u,i}\) 表示以 \(u\) 为根的子树中选取 \(i\) 个点的子集所能得到的最大最小值

由于合法的情况是一个前缀且单调不升,所以考虑使用 multiset 来维护。

叶子节点就是直接放进去一个 \(w_u\)

考虑不是叶子节点的情况。由于 \(u\) 的不同儿子之间互不影响,所以直接全部合并到 \(f_u\) 里面就行了。

使用启发式合并,复杂度 \(\text O(n\log^2n)\)

然后考虑 \(w_u\) 的贡献。其实就是在合并完的 \(f_u\) 中找到最靠前的一个 \(\ge w_u\) 的点,将前一个点替换成 \(w_u\) 就行,若没有前一个点就直接加入。容易发现这样是最优的。

[ICPC 2016 WF] Longest Rivers

一颗 \(n+m+1\) 个节点的树,有 \(n\) 个叶子,\(m\) 个中间点和 \(0\) 这个根。

每个叶子节点当作一条河流的发源地,每个河道只能被化为流入它的所有河流之一,对于每个发源地求出将所有河流排序后它的排名的最高可能值。

\(1 \le n \le 5\times 10^5,0\le m \lt n\)


首先确定一个贪心思路:

令当前点流到根节点的路径长度为 \(now\)

  • 若所有流入当前点的路径都无法超过 \(now\),则选取最短的一条。
  • 否则选择一条超过 \(now\) 的。

这样就可以 \(\text O(n^2)\) 完成,考虑优化。

答案是大于 \(now\) 的路径的最小数量加一,所以 \(p\) 到根节点的路径全部分给 \(p\) 一定是最优方案之一,因为不会产生贡献。直接把这个限制拿掉,相当于就是求长度大于 \(now\) 的路径最少数量了。

发现更新每个点的时候都可以看作有一下三种状态:

  1. 子节点中本身就有大于 \(now\) 的路径。
  2. 子结点中没有大于 \(now\) 的路径,但是子结点中存在点流到当前点就大于 \(now\)
  3. 无论如何流到当前点都不会大于 \(now\)

答案其实可以从情况 2 进行统计。

\(now\) 增大的过程中所有点的情况编号只会增加不会减少并且 1/3 情况可以以 2 作为分界,因此尝试维护 2 情况的点。

\(dp_x\) 表示从 \(x\) 点流到父节点后得到的最小路径长度,容易 \(\text O(n)\) 求出。

一开始所有子节点都是 2 情况,将它们都放入小根堆,按照 \(dp\) 排序,若 \(now \gt dp_x\)\(x\) 会从 2 情况变为 3 情况。

若一个 1 情况的点没有了 1/2 情况的点的入度即没有以当前点作为结尾的大于 \(now\) 的路径,则判断当前点的 \(dp\) 值与 \(now\) 的关系,然后改为情况 2/3,若是情况 2 则放入堆中。

将所有 \(now\) 和对应的情况 2 数量用 map 存下,答案可以直接二分求出。

[CF2075F] Beautiful Sequence Returns

给一个长度为 \(n\) 的序列 \(a\),令 \(b\)\(a\) 的一个子序列。若 \(b_1\)\(b\) 的严格最小值,\(b_{|b|}\)\(b\) 的严格最大值则称 \(b\) 为好的子序列。求最长的好的子序列的长度。

\(1\le n \le 5\times 10^5\)


一个显然的结论是一定存在最优解使得子序列左端点一定是严格前缀最小值,右端点一定是严格后缀最大值。

列出所有前缀最小值和后缀最大值,发现它们的值都是随下标增大单调递减的。

若确定了左右端点其实就是要求满足 \(l \lt j \lt r\)\(a_l \lt a_j \lt a_r\)\(j\) 的数量,这是矩阵数点

发现对于每个点能够覆盖它的左端点或右端点都是一个区间,那么可以二分出区间左端点和右端点,然后扫描线搭配线段树区间加和全局最大值来完成。复杂度 \(\text O(n\log n)\)

[AT_c_2016_f_g] Zigzag MST

给定 \(N,Q\),对一张 \(N\) 个点的图做 \(Q\) 次加边操作,每次给定 \(A_i,B_i,C_i\),然后按顺序连边 \((A_i,B_i,C_i),(B_i,A_i+1,C_i+1),(A_i+1,B_i+1,C_i+2),(B_i+1,A_i+2,C_i+3),(A_i+2,B_i+2,C_i+4)\) 等等,\(A_i,B_i\)\(n\) 取模。

求该图的最小生成树。

\(2\le N\le 200000,1\le Q\le 200000,0\le A_i,B_i\le N-1,1\le C_i\le 10^9\)


非常神奇的思路。

发现如果要连 \((B_i,A_i+1,C_i+1)\) 的话,\(B_i\)\(A_i\) 一定是连通的,所以相当于是 \((A_i,A_i+1,C_i+1)\)

所以对于所有的边进行类似的转换后就会变成:

\((A_i,B_i,C_i),(A_i,A_i+1,C_i+1),(B_i,B_i+1,C_i+2),(A_i+1,A_i+2,C_i+3),(B_i+1,B_i+2,C_i+4)\dots\)

发现除了 \((A_i,B_i,C_i)\) 其他边都在环上,所以可以直接一起处理环上的边,保留下来 \(n\) 条,总边数为 \(n+q\)

直接 Kruscal 就行。

[SCOI2009] 围豆豆

\(N\times M\) 的方格图,一些点上有障碍或豆子,一共有 \(k\) 个豆子,每个豆子都对应的价值。在图上任意选取一个点,都一段路程后回到这个点,定义所获得的价值为:所走的多边形围住的豆子的价值减走的步数。求最大价值。

\(1\le N,M\le 10,1\le k\le 9\)


一眼状压,然后不会了。。。

发现主要难点是怎么确定哪些点在多边形内部?

结合计算几何的知识考虑,每个点在一个多边形内当且仅当从这个点向任意一个方向发射一条射线所经过的点数为奇数。

让所有点的射线都往右就行了。\(dp_{x,y,s}\) 表示当前在 \((x,y)\),所有豆子的射线经过边数的奇偶性状态。

转移很简单,考虑怎么搞转移顺序?

其实当 \(s\) 确定后豆子的贡献就确定了,所以只需要求最短路就行。因为边长是 \(1\),所以可以直接 bfs。

这里还有一个问题,题目中是在格子上走,多边形的边到底该如何定义?由于不能走豆子,所以我们可以直接把所有格子当作其右下角的点,每次转移时如果上下走动就把覆盖的那一条边左边所有豆子的奇偶性变换。

Shopping

\(n\) 种物品连成一棵树,给定每种物品的价值 \(w_i\),价格 \(c_i\),个数 \(d_i\)。要求买了的物品必须构成一个连通块,求总体积最大为 \(m\) 的最大总价值。

\(1 \le n \le 500,1\le m \le 4000\)


很简单就可以想到 \(\text O(nm^2)\) 的树型 dp 的做法,显然是过不了的。

这其实是树上依赖背包的板子。

发现复杂度高的主要原因是因为背包在树上进行,如果能够尝试将树拆成序列复杂度就能得到降低。

考虑如果确定了一定要选取 \(x\) 该怎么做,如果可以用 \(\text O(nm)\) 的复杂度求出就可以用点分治解决。

我们知道如果选取了 \(i\) 那么 \(i\) 的所有祖先都要选择,所以若不选取 \(i\) 则要把 \(i\) 的所有子树中的点跳过,所以将所有点按照 dfn 序排序,所以选择 \(i\) 则从 \(dp_{i+1}\) 转移,若不选择则从 \(dp_{i+siz_i}\) 转移。

用单调队列优化多重背包。嘿!我之前竟然不会。

\[dp_{i,j}=max(dp_{i-1,j-v_i\times u}+w_i\times u) \]

\(j=x\times v_i + b,(0\le b \lt v_i)\)

\[dp_{i,j}=max(dp_{i-1,(x-u)\times v_i+b}+w_i \times u) \]

\(p=x-u\)

\[dp_{i,j}=max(dp_{i-1,p\times v_i+b}-p\times w_i+x \times w_i) \]

枚举 \(b\) 后再枚举 \(x\)

由于 \(1\le u \le d_i\) 所以 \(x-d_i\le p \lt x\)

滑动窗口即可,复杂度 \(\text O(v_i\times \frac{m}{v_i}\times n)=\text O(nm)\)

总复杂度 \(\text O(nm\log n)\)

[CTS2023] 琪露诺的符卡交换

\(n\) 种卡片,每种 \(n\) 张,\(n\) 个人每人初始 \(n\) 张卡片。卡片可以在不同人之间交换,每张卡片只能交换一次,最终要使得每个人都有 \(n\) 种不同的卡片,输出交换方案。

\(1 \le n \le 400\)


考虑一个非常神奇的交换方法,\(\forall 1\le i \lt n,i \lt j \le n\)。交换 \((i,j)\)\((j,i)\)

这就变成了要使最开始的情况中每列都有 \(n\) 种不同的卡片。

显然同一行之间是可以直接交换的,最后只需要把答案的编号换一下就行了。

发现这是一个二分图匹配问题,我们可以直接二分图匹配 \(n\) 次,每次把已经用过的那些数删掉就行。

由于每一列只会用掉每种卡牌各一个,所以每种颜色的卡片一定会存在,所以是满足 Hall 定理的,一定有解。

[AGC018F] Two Trees

给定两棵有根树 \(A\)\(B\) ,各有 \(N\) 个节点。在第一棵树中。

我们需要给每个节点编号构造出一个权值,使在两棵树上均满足任意节点子树权值和的绝对值\(1\)


首先发现如果两棵树中相同编号节点儿子数量的奇偶性不同是一定无解的。

考虑如果相同改怎么办。

儿子数量的奇偶性可以转换为度数的奇偶性,因此想到欧拉回路。

度数为奇数的两个相同编号点之间连一条边,两个根节点可以连向一个虚点。

此时跑欧拉回路,如果一个编号的点之间没有连边,那么权值就为 \(0\),否则根据欧拉回路的方向定 \(1/-1\)

证明一下这为什么是对的:

我们把欧拉回路拆成环,考虑所有环对于某个点的贡献,可以将环分为两类:

  • 不经过当前点到父亲的路径,此时要么在字数外,没贡献,要么在子树内,一来一回抵消了。
  • 经过当前点到父亲的路径,产生 \(1/-1\) 的贡献。

显然第二类环有且只有一个。

[AGC016F] Games on DAG

给定一个 \(n\) 个点 \(m\) 条边的 DAG,\(1,2\) 号点各一个石头,每次可以沿 DAG 上的边移动一颗石头,石头可以重合。不能移动则输,求所有 \(2^{m}\) 个边的子集中,只保留这个子集先手必胜的方案个数。

\(1\le n \le 15\)


非常有意思的一道题。

首先显然 \(1,2\) 的 SG 函数相等时时先手必胜。

考虑将所有 SG 函数相同的点放在一个点集,假设此时 SG 函数为 \(x\),集合为 \(S_x\),由于 SG 函数的计算过程是 mex:

  • \(\forall i \lt x\)\(S_x\) 中的任意一个点都至少连向 \(S_i\) 中的一个点。
  • \(S_x\) 中所有点之间没有连边。
  • \(\forall i \gt x\)\(S_i\) 中的点可以和 \(S_x\) 中的点任意连边。

所以可以考虑状压 dp,\(dp_s\) 表示点集为 \(s\) 时的答案。

每次子集枚举出 \(S_0\) 集合,所有点都要有向 \(S_0\) 的边,\(S_0\) 的边向 \(S_{1\sim n}\) 的边随便连。

然后剩余的可以又当作一个子问题完成。

加上一些预处理复杂度可以做到 \(\text O(3^nn)\)

[APC001F] XOR Tree

\(n\) 个点的树,每次选取一条链将所有边权异或任意数 \(x\),求使得所有边权变为 \(0\) 的最小操作次数。

\(1\le n \le 10^5,0\le a_i \lt 16\)


诈骗题。

首先发现可以之间将边权变成点权,点权就是与这个点相连的所有边的异或和。

显然只有当点权全部为 \(0\) 时边权才全部为 \(0\)。修改操作就变成了两个数异或相同数了。

直接把所有相同的数先处理掉,剩余最多 \(16\) 个数,直接状压 dp 就行了。

[SHOI2009] 舞会

\(n\) 个男生 \(n\) 个女生,给出每个人的身高,要将男女配对,使得女比男高的组最多 \(k\) 组,求方案数。

\(1\le n \le 200\),高精度。


抽象,不知道为什么要搞高精度。

首先将男女都按身高排序,\(dp_{i,j}\) 表示前 \(i\) 个男生和前 \(i\) 个女生配对有 \(j\) 组女比男高的方案数。

由于有高精度,只能 \(\text O(n^2)\) 转移。

分情况讨论:

  • 若当前一组女生比男生高:

    • 若加入当前这一组后 \(j\) 不会增加。

      出现这种情况一定就是因为当前的女生换到了一个不比当前男生高的女生,并且这个女生原本比她匹配的那个男生要高。这要怎么算呢?其实直接用 \(j\) 减去比当前男生高的女生数量就行了,因为如果一个女生比当前男生高,由于原本就进行了升序排序,在她原本的配对中一定也是比男生高的。

    • 若加入当前这一组后 \(j\) 会增加。

      和上面相反的。

  • 若当前一组女生没男生高:

    • 若加入当前这一组后 \(j\) 不会增加。

      这有两种情况:

      • 置换了一个原先就比男生高的女生,数量为 \(j\)
      • 置换了一个本就没有男生高的女生且这个男生也不比当前女生矮,直接 \(O(n)\) 枚举就行了哦。

      显然这两种情况不会重合。

    • 若加入当前这一组后 \(j\) 会增加。

      和上面相反的。

[ZJOI2016] 小星星

给定一个 \(n\) 个点 \(m\) 条边的无向图和一个 \(n\) 个点的树,求有多少种 \(1\sim n\) 的排列使得对于树上的每一条边 \((u,v)\) 都有一条在无向图上的边 \((p_u,p_v)\)

\(1\le n \le 17\)


很有启发的一道容斥。

首先令 \(dp_{i,j,S}\) 表示树型 dp 到了点 \(i\),当前点编号为 \(j\),用过的编号的集合为 \(S\)。用子集枚举来完成复杂度显然为 \(\text O(n^33^n)\),无法通过。

发现要求的是每一条边都能匹配,那么能否将没有匹配某条边作为容斥的单位集合呢?显然是不行的,因为方案和树的形态挂钩,这么做复杂度更炸裂。

那怎么办呢?我们知道 \(j\) 一定要保留,那么能不能考虑省掉 \(S\) 呢?当然可以!

直接 \(\text O(2^n)\) 枚举哪些编号可以被使用,每次 \(n^3\) dp 一遍就行,最后容斥出答案。

复杂度为 \(\text O(n^32^n)\),需要卡一卡常。

[ARC093F] Dark Horse

\(2^n\) 个人,按照满二叉树的形态进行淘汰赛。

\(1\) 个人只打不过 \(a_1 \sim a_m\),除第一个人外编号小的打得过编号大的人。

\(2^n\) 个人在叶子上任意排列,求有多少种情况 \(1\) 可以取得最终胜利。

\(1\le n,m \le 16\)


首先很显然的可以直接强制将 \(1\) 放在第一个位置,最终答案乘上 \(2^n\) 就行了。

然后再一看发现 \(1\) 一共会打 \(n\) 场比赛,每次和长度为 \(1,2,4,\dots,2^{n-1}\) 的块的最小值比赛。

我们要求每个块中的最小值的都不在 \(A\) 中,显然可以用容斥做。

\(dp_{i,S}\) 表示考虑了前 \(i\) 个打不过的人后 \(S\) 中为 \(1\) 的块被填入,其余块一个数都没有填的情况数。

这样有一个很妙的地方,\(S\) 的大小其实就是所有填入了的块的总长。

但是这样会出现一个问题,我们依然不知道有多少个大于 \(a_i\) 的没用过的数。所以我们要在一开始将 \(a\) 从大到小排序,这样之前用过的数就一定都是大于 \(a_i\) 的数。

看怎么转移:

  • \(a_i\) 不构成新块,那么就直接不管,让后面的 \(a_i\) 来考虑它:\(dp_{i,S} = dp_{i - 1,S}\)

  • \(a_i\) 构成新块,令块的编号为 \(k\)

    \[dp_{i,S\or 2^k}=(dp_{i,S\or 2^k}+dp_{i-1,S}\times \binom{2^n-1-a_i-S}{2^k-1}\times (2^k)!) \]

最后还要乘 \((2^n-1-S)!\),因为没有放入块的点可以随意排列。

不相交路径

给出一个 \(n(n\le150)\) 个结点的有向无环简单图。

给出 \(4\) 个不同的点 \(a,b,c,d\),定义不相交路径为两条路径,两条路径的起点分别为 \(a\)\(c\),对应的两条路径的终点为 \(b\)\(d\),要求满足这两条路径不相交,即两条路径上没有公共的点。

现在要求不相交路径的方案数。


给出一个 thr 想出的惊为天人的写法。

先拓扑排序,然后令 \(dp_{i,j}\) 表示当前终点为 \(i,j\) 时的答案,\(dp_{a,c}=1\),答案为 \(dp_{b,d}\)

每次只跳拓扑序小的那点,可以保证正确。

[ARC121F] Logical Operations on Tree

给定一棵树,给每个点填 \(0\)\(1\),给每条边填 AND 或 OR,在所有 \(2^{n+n−1}\) 种填法中,计数有多少种满足存在一种缩边的顺序,使得每次把一条边的两个端点缩成一个点,权为原端点与边的运算值,最终点的权为 \(1\)

\(1 \le n \le 10^5\)


挺好的一道题。

首先发现先缩掉所有 AND 再缩 OR 一定是最优的。

所以直接求 AND 连通块至少有一个是全 \(1\) 就行。显然可以容斥,直接用总方案数减去全都不是全 \(1\) 的方案数。

树型 DP 即可。

posted @ 2025-03-20 16:52  paper_zym  阅读(101)  评论(0)    收藏  举报