今天的题都比较简单。
T1:很容易想到状压dp。关键在于怎样判断用一个半径为r的圆是否能覆盖某个集合的点。其实这个也不难,我们可以暴力求出这些点两两间的最大距离,若maxdis<=2r则可以,否则不行。
T2:设f(d)表示gcd为d的对数,g(d)表示gcd为d的倍数的对数。首先g(d)=(n/d)*(m/d)(要下取整)。而f(d)=g(d)-sum(f(id))(i>=2)。可以证明时间复杂度是对的。求出了f之后,用线段树维护答案即可。
T3:首先求出任意一颗生成树,然后接下来要做的就是加边维护桥的操作。
具体可以用并查集来维护。首先对于每加入的一条边(x,y),先找到x和y的lca。具体操作就是每次把x和y中深度较大的那一个点跳到父节点。找到了lca之后,我们就把x和y到lca上的点的并查集都合并到lca上。注意到每合并一次没有合并过的点就会导致桥的数量减1,所以在合并的时候记录一下就可以求出答案了。