杂题记录2

CF53E Dead Ends(状态压缩)

题意

给你 \(n\) 个点和 \(m\) 条边,求这个图的有 \(k\) 个叶子的生成树的个数 (\(n \leq 10\))

solution

\(n\) 特别小,考虑状压,于是状态设计就是 \(dp_{sta1,sta2}\) 表示 \(sta1\) 的点与 \(1\) 联通,其中 \(sta2\) 的点是叶子节点
转移的话就是新加入一条边 \((u,v)\)\(u\) 原来就与 \(1\) 联通 )时,把 \(v\) 加到 \(sta1\)\(sta2\) 里,如果 \(u\) 原来在 \(sta2\) 里就把他除去
但是这样可能会算重,比如对于 \(2-1-3\) 的图,可能是把 \(3\) 加到 \(2-1\) 里,也有可能是把 \(2\) 加到 \(1-3\)
所以我们可以人为钦定一下加叶子的顺序,具体的,如果 \(v\) 是转移后编号最大的叶子才转移
submission

CF70E Information Reform(树形dp)

题意

给你一颗树,你可以花 \(k\) 的代价将一个节点变为区域信息中心,对于每个节点,若它到离他最近的区域信息中心的距离为 \(dis\) 则代价为 \(d_{dis}\)\(d\) 数组单调不降),求最小代价,并输出每个节点选择的最近区域信息中心编号 (\(n \leq 180\)

solution

很显然要 $dp $ ,设 \(dp_{i,j}\) 表示节点 \(i\) 选择 \(j\) 为区域信息中心,子树内代价最小值,转移的话,枚举儿子选的区域信息中心,如果和 \(i\) 选的一样就减去 \(k\) ,初始值就是 \(dp_{i,j}=d_{dis_{i,j}} + k\),转移式子:

$dp_{t,i}=\sum_{to \in son_{t} } min ( dp_{to,j}-(i==j) \times k ) $

submission

CF115E Linear Kingdom Races(线段树优化dp)

题意

\(n\) 条道路,每条道路修缮的代价为 \(w_i\) ,给定 \(m\) 个区间,当你将区间 \([l_i,r_i]\) 的道路都修缮完后会获得 \(v_i\) 的代价,问你最后总代价最大是多少 (\(n,m \leq 2\times 10^5\)

solution

和NOIP2023T4天天爱跑步很像,先考虑朴素 \(dp\) ,设 \(dp_i\) 表示考虑了前 \(i\) 条道路的最大代价,转移就是 \(dp_i={max \{ dp_{j-1}+calc(j,i),dp_{i-1}\}}\) 其中 \(calc(j,i)\) 表示将 \(j\)\(i\) 这一段道路修缮后能满足的区间获得的价值减去修道路需要代价。优化的话,扫描线维护区间获得的代价就行,线段树第 \(i\) 个位置表示 \(dp_{i-1}+calc(i,now)\) 维护区间最小值即可,注意 $dp_i $要和前面的 \(dp_j\)\(max\)

submission

CF258E Little Elephant and Tree) (扫描线)

题意

有一棵根节点为 \(1\) 的有根树,这棵树每个节点都有一个集合,初始为空。

进行 \(m\) 次操作,第 \(i\) 次操作给出 \(a_i\)\(b_i\),把 \(i\) 这个数字分别放入 \(a_i\) 和 b_i$ 这两个点为根的子树里的所有集合中。

最后输出每个点有多少个除它本身的点集合与它的集合有交集

solution

每次相当于把 \([dfn_a,dfn_a+siz_a-1]\)\([dfn_b,dfn_b+siz_b-1]\) 这两个区间互相加入代价(包括他们本身的子树)于是可以扫描线 ,在 \(dfn_x\) 时加入贡献, \(dfn_x+siz_x\) 时减去贡献。但是最后要求有多少不同的点,直接维护比较难搞,于是正难则反维护有多少个点为 \(0\) ,于是维护最小值和最小值的个数即可。

Submission #345994030 - Codeforces

CF285E Positions in Permutations (计数)

题意

给定 \(n\)\(k\) ,求有多少个 \(n\) 的排列 \(p\) 使得 $ |p_i-i|=1$ 的 \(i\) 的个数 恰好\(k\)

solution

因为题目问的是恰好,所以可以考虑求钦定的然后再二项式反演:令 \(g_i\) 表示钦定至少有 \(i\) 个位置满足条件,答案就是 \(\sum_{i=k}^{n} (-1)^{(k-i)} \times \binom{i}{k} \times g_i\) 所以现在考虑怎么求 \(g_i\) 。令$ f_{i,j,0/1,0/1}$ 表示考虑了前 \(i\) 个位置,有 \(j\) 个地方满足条件,且 \(i\)\(i+1\) 分别有没有被选的方案数,简单转移即可,注意\(i=n\) 时 要特判。最后 \(g_i=(f_{n,i,0,0}+f_{n,i,1,0})\times (n-i)!\)

Submission #346014626 - Codeforces

CF383E Vowels (高维前缀和)

题意

有一个由‘a’-'x' 组成的元音集合,但是你不知道有哪些字母在里面,给你 \(n(n\leq 10^4)\) 个由三个字符组成的单词,一个单词合法的条件是里面至少有一个原因字母,问你对于 \(2^{24}\) 种可能的元音集合,有多少个合法的单词数,输出所有答案的平方的异或和

solution

设元音字母集合为 $sta $ 则一个单词不合法当且仅当它的字符集属于 $sta $ 的补集。所以对于补集的子集有多少个数可以用高维前缀和来做,每次枚举一个元素 \(i\) 然后枚举所有集合 \(j\)\(i \in j\)\(dp_j+=dp_{j \oplus (1<<i)}\) 这样就能求出 \(j\) 的所有子集的和

Submission #346017972 - Codeforces

posted @ 2025-10-27 19:14  Xdik  阅读(2)  评论(0)    收藏  举报