其他分享
首页 > 其他分享> > 模拟50 题解

模拟50 题解

作者:互联网

A. 施工

 

 

 

 

 

B. 蔬菜

正解还是用到了分块的思想:

1.对于出现次数很多的蔬菜,直接用前缀和累计答案。

2.对于出现次数较少的蔬菜,考虑将平方的含义转化为点对。

将一棵蔬菜定义为点$(x,y)$,那么任意相同的两棵蔬菜(可以是同一个棵)可以表示为点对$(x_1,x_2,y_1,y_2)$。

设询问为$(x,y)(X,Y)$,即统计有多少个点对满足:

$x<=x_1<=X$

$x<=x_2<=X$

$y<=y_1<=Y$

$y<=y_2<=Y$

 

 

C. 联盟

可以说是三道题里最简单的一道。

首先,题中定义的危险程度,树上最远两点距离,即树的直径。

那么问题被转化成割掉树上一条边,求如何用一条边连接两棵树使新树的直径最小。

显然最优决策一定是连上两棵新树的直径中点,因为任何改变位置都会使新树的直径更长。

于是问题转化成如何求原树上,割掉一条边之后两棵新树的直径。

正常的思路都是选节点1作为根节点,进行dfs求出子树直径。

然而问题是,有一些联通块无法被1的子树表示出来。

那么考虑转化思路,我们分别以树上一条直径的两个端点作为根节点,求出子树的直径。

于是分类讨论就可以了:

1.割掉非直径边:那么直径所在联通块的直径就是原树的直径,另一侧的直径可以被任意一个dp数组表示出来。

2.割掉直径边:那么两个dp数组分别表示一个联通块的直径。

最后随便选一条符合的答案,抽出两条直径连中点就可以了。

标签:新树,题解,蔬菜,50,为点,直径,树上,割掉,模拟
来源: https://www.cnblogs.com/skyh/p/11573202.html