2019.7.17海量暑假集训Day12考试总结

it2022-05-05  154

  对于代码和题目详见百度网盘,这只讲思路。

  首先我要吐槽一下,这为何可以用点分治做,而且还有两道!都是模板,我不会啊!!!!

  T1,这是一道和换根DP的的模板非常的接近,只是加了以为,我们以图讲解:

  对于这一张图,首先我们用一个f[i][j]表示i号点和其他点长度为j的个数,d[i][j]表示i号点这个子树里的到他距离为j的点的个数,显然,f[1][i]=d[1][i],而d数组是可以通过一遍dfs处理出来的,所以我们现在考虑怎么累计答案,对于一个f[y][i]如上图,我们可以把他的求法分成两部分:1,y中子树为i的个数,2,y子树外面的部分。对于第一问,就是d[y][i],对于第二问,我们考虑这个怎么从x转移,由于x到y有一条遍,所以就是f[x][i-1]进行转移,但是在y的子树中也有这种边,所以要减去d[y][i-2]。整理一下,就是f[y][i]=f[x][i-1]-d[y][i-2]+d[y][i]直接转移即可。

  T2,这一道题和上面的差不多,思路几乎一样,首先考虑一条长度为L的路径,对答案的贡献是L / k上取整,即 [L + f(L, k)] / k

其中f(L, k)为要令L整除k,需要加上的数值例:f(10, 3) = 2, f(11, 3) = 1, f(12, 3) = 0那么,我们可以把问题分解成枚举路径后,对L的求和以及对f(L, k)的求和L 的求和非常容易(就是上一题……)f(L, k)的求和其实也不难使用和上一题类似的DP状态原本DP[u][dep]表示以u为根的子树里有多少深度为dep的节点现在DP[u][dep_m]表示以u为根的子树里有多少深度模kdep_m的节点枚举f(L, k)的所有可能取值(0~k-1),例如取值为t,计算出f(L, k)相应的路径的数量,在计数器上累加t*numt,最后把求和结果除以k即可

  T3,首先我们可以考虑一下这个题的一个弱化版,不求唯一,求删去边后一定要是最大图匹配的个数。

  这个最大图的匹配和中的一个x的匹配和它的子树y有着深刻的联系,那么,我们就用两个数组表示这一个点是否有和子节点匹配,但是我们还要找的是一个图的唯一匹配,那么怎么做呢?这是对于这一道题的唯一最大图匹配的性质:对于树上的节点,要么他属于最大匹配,要么他是一个孤立点。那么我们就可以设3个变量一个表示u节点在匹配中,等待与父节点匹配一个表示u节点是孤立点还有一个表示u节点在匹配中,已经与子节点匹配。这三个自个2转移即可

 

 


最新回复(0)