test#2
作者:互联网
8.16模拟赛(综合2)
A.极源流体
不会。
B.等差数列
考点:数学
考虑枚举公差k,并枚举不变的数a[i]。
此时确定了公差和序列中的一个数,整个序列就确定了。
检验序列是否合法:
-
公差为负数:a[i]-(i-1)*k>0。
这样可以保证能够从a[1]至a[i]之间每两项之间的差不为负数。
-
任意一项\leq\ w:a[i]+(n-i)*k\leq\ w
保证序列里最大的数\leq\ w
在确定k时,确定不同的k,也会唯一地确定了首项。所以将每个k下不同的a[i]映射到首项上。
如果两个数a[i]与a[j],映射到的首项相同,说明这两个数可以同时存在于首项相同并且公差相同的序列也就是同一序列中。
因此,对于每个k,统计被映射到最多的首项的数量,也就统计出来了最多可以存在于同一序列中的原序列中的数的数量,也就是最多不用修改的数的数量。
最后用n减去这个数,也就是要求的最少的修改次数。
对于每个k进行类似的操作,每次都取min即可。
C.送给好友的礼物
考点:树形dp
简化问题,如果以一个点为根的子树内不包含任何草莓节点,就把这棵树删除。
可以用dfs,如果需要删除时,直接将e[i].to=0
这样做显然不会影响答案,而且所有叶子节点都是草莓节点。
转化问题为:对于一棵树,有两个人同时从根去遍历它,问整棵树都被遍历完且两人最后回到根的最小时间是多少。
注意,求的是时间的最大值,所以应该是路径长度取max,而不是求和。
记dp[i][j]表示遍历完i子树,其中第一个人走了j步,第二个走的最少步数。
进行树形背包时,枚举第一个人在u子树内走的步数i,分为三种情况。
-
第一个人不进入v子树,第二个人走完v子树。
dp[u][i]+dp[v][0]+2
-
第一个人走完v子树,第二个人不进入v子树。
dp[u][i-size[v]*2]+dp[v][(size[v]-1)*2]
-
第一个人与第二个人共同走完v子树。
-
枚举第一个人在v子树内走的步数
dp[u][i]=dp[u][i-j-2]+dp[v][j]+2
-
D.非常困难的压轴题
考点:字符串
给出的数据范围是个迷……
分别统计L的前缀和与S的后缀和。
记suml[i]为[1,i]中L的个数,记sums[i]为[i,len]中S的个数。
最后枚举每个位置i,如果位置i上的字母是W,那么ans+=suml[i-1]*sums[i+1]。
注意开longlong,能拿的分一定要拿。
标签:子树,公差,序列,枚举,test,首项,dp 来源: https://www.cnblogs.com/Rapunzel/p/15185040.html