10.16
10.16
P3047 [USACO12FEB] Nearby Cows G
FJ 注意到了他的奶牛经常在附近的田地移动。考虑到这个事情,他想要在每个田地里种足够的草,不仅是为了最初在那块地里的奶牛,也是为了从附近田地来的奶牛。
特别地,FJ 的农场由 N(1≤N≤100000) 个田地组成,某些田地之间由双向道路连接(一共有 N−1 条)。对于田地i,它是C\(_{i}\)头奶牛的家,尽管奶牛有时能经过最多 K 条边去到其它田地
FJ 想在任意一个田地 i 中种足够的草去喂养最大数量的奶牛M\(_{i}\)(最终可能到这块地的奶牛),即仅经过最多 K(1≤K≤20) 条边到达这里的奶牛。给定农场的结构和任意一个田地的奶牛数量C\(_{i}\)
请求出对于任意一个 i 求出对应的M\(_{i}\)
简化题意:给出一棵树,求出任意一个结点i往外走k条边能达到的C\(_{i}\)总和,即ans\(_{u}\)=\(\Sigma\)\(_{w(u,v)<=k}\)C\(_{v}\)
考虑到题目给出的图是一棵树,考虑树形dp:
不妨设f\(_{i,j}\)为在以i为根的子树内往下走j步能达到的C\(_{i}\)的总和,有一个简单的状态转移方程:
f\(_{u,i}\) = f\(_{u,i}\) + f\(_{v,i-1}\) v属于Son\(_{u}\).
令g\(_{u,j}\) = 从u出发,往上或往下走j步能到达的C\(_{i}\)总和
我们钦定1为根,即g\(_{1,i}\) = f\(_{1,i}\)
那么其他点怎么利用f转移呢?
考虑初始化:
我们知道g\(_{i,j}\)必定包含f\(_{i,j}\)
所以初始化为:g\(_{i,j}\) = f\(_{i,j}\)
我们考虑换根dp:
首先,以v为起点,走一步可以到达父亲u,所以
f\(_{v,1}\) += f\(_{u,0}\)
假设目前已知g\(_{u,i}\),我们知道不管是u->v或v->u都需要消耗一步,则g\(_{v,i}\) += g\(_{u,i-1}\).
但我们会发现,g\(_{u,i-1}\)会包含f\(_{v,i-2}\),减去便可,于是得到状态转移方程
g\(_{v,i}\) += g\(_{u,i-1}\) - f\(_{v,i-2}\)
时间复杂度是O(n)的
P10723 [GESP202406 七级] 黑白翻转
小杨有一棵包含 n 个节点的树,这棵树上的任意一个节点要么是白色,要么是黑色。小杨认为一棵树是美丽树当且仅当在删除所有白色节点之后,剩余节点仍然组成一棵树。
小杨每次操作可以选择一个白色节点将它的颜色变为黑色,他想知道自己最少要执行多少次操作可以使得这棵树变为美丽树。
我们知道,当某个白点被两个黑点夹住时,这个白点是必须被染色的
则按照此策略进行染色必定正确
即:若u点为白色,且u的子树中有黑点,则u点需要被染色(我们强制以黑点为原始根)
P9584 「MXOI Round 1」城市
简化题意:给出一棵有n个点的树,树上有边权,现需要新建点n+1,有q个方案n+1->u,请求出新建后,任意两个点间的边权和,即\(\Sigma\)\(_{i=1}^{n+1}\)\(\Sigma\)\(_{j=1}^{n+1}\)cost(i,j)
这是一道换根dp的模板题,\(\Sigma\)\(_{i=1}^{n}\)\(\Sigma\)\(_{j=1}^{n}\)cost(i,j)可以看做以每个点为根时树上每个节点到根的距离和
这里可以使用换根dp解决,而新建道路可以直接通过前缀和算出来。
时间复杂度O(n)
P7334 [JRKSJ R1] 吊打
给出一个长为n的序列a\(_{1-n}\) , 接下来有两种操作共m次:
1 l r : 表示将区间[l,r]的a开方并下取整
2 l r: 表示将区间[l,r]的a平方
在所有操作结束后,请你输出\(\Sigma\)\(_{i=1}^{n}\)a\(_{i}\) mod 998244353
区间操作首先考虑线段树:
对于区间开方操作,我们考虑维护区间最大值max,若max<=1则此区间开方必是1,否则暴力开方
对于区间平方操作,我们与区间开方操作联动,平方后再开方是不变的,我们考虑维护区间平方次数cnt,若cnt>0,则在区间开方时只将cnt--
但同时我们还要考虑如何判断cnt可减,考虑维护区间cnt最小值minxc,只有minxc>0时才能对此区间cnt进行操作,如何处理标记下传?
考虑维护区间平方次数标记标记tag,当需下传时直接将tag下传即可
综上所述:
我们维护五个参数:区间和(sum,只维护左端点=右端点的区间),区间最大值(max),区间平方次数(cnt),区间平方次数最小值(minxc),区间平方次数标记(tag)
当需区间开方时,首先考虑是否能与之前的区间平方抵消(minxc>0),若抵消不了,则暴力开方(若区间max<=1,则不做开方处理)
当需区间平方时,只对cnt,minxc,tag进行操作即可
计算答案:若在抵消后仍需开方,则直接开方即可(在操作时已完成)
若仍需计算n次方,则采取欧拉降幂方法,O(logp)完成计算
总时间复杂度O(mlogn)
P4163 [SCOI2007] 排列
给一个数字串 s 和正整数 d, 统计 s 有多少种不同的排列能被 d 整除(可以有前导 0)。例如 123434 有 90 种排列能被 2 整除,其中末位为 2 的有 30 种,末位为 4 的有 60 种。
s 的长度不超过 10,1≤d≤1000,1≤T≤15。
注意到数据范围,s的范围十分小,考虑状压dp
设f\(_{S,k}\) = 当选取状态为S时选出的数mod d = k是的方案数
容易得出状态转移方程:
f\(_{S|(1<<j),((k*10)+aj)mod d}\) += f\(_{S,k}\)
时间复杂度O(2\(^{s}\)nd)
这是一道比较板的状压dp难点在于第二维的设计
但总体来说作为一道入门题较为合适
浙公网安备 33010602011771号