杂题记录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 ) $
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\)
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\) 的所有子集的和

浙公网安备 33010602011771号