[树的点分治] [BZOJ3648] 寝室管理

题目描述 Description

T64有一个好朋友,叫T128。T128是寄宿生,并且最近被老师叫过去当宿管了。宿管可不是一件很好做的工作,碰巧T128有一个工作上的问题想请T64帮忙解决。
T128的寝室条件不是很好,所以没有很多钱来装修。礼间寝室仅由n1 条双向道路连接,而且任意两间寝室之间都可以互达。最近,T128被要求对一条路径上的所有寝室进行管理,这条路径不会重复经过某个点或某条边。但他不记得是哪条路径了。他只记得这条路径上有不少于k 个寝室。于是,他想请T64帮忙数一下,有多少条这样的路径满足条件。
嗯…还有一个问题。由于最近有一些熊孩子不准晚上讲话很不爽,他们决定修筑一条“情报通道”,如果通道建成,寝室就变成了一个n 个点n 条边的无向图。并且,经过“情报通道”的路径也是合法的。T128心想:通道建成之前,T64还有一个高效的算法帮我数路径条数,但是通道建成之后,他还有办法吗?对,T64手忙脚乱,根本数不清有多少条路径。于是他找到了你。

输入 Input

第一行为三个正整数nmk2kn ),代表有n 间寝室,m 条边连接它们(n1mnm=n1 意味着“情报通道”未被修好;m=n 意味着“情报通道”已被修好),以及题目描述中的k
接下来m 行,每行两个正整数xy ,代表第x 间寝室与第y 间寝室之间有一条双向边。

输出 Output

仅包含一个整数,代表经过至少k 间寝室的路径条数。

样例输入 Sample Input

5 5 2
1 3
2 4
3 5
4 1
5 2

样例输出 Sample Output

20

提示 Hint

Hint

限制 Limits

n105,knm 的要求如输入
Time Limit : 4s & Memory Limit : 512MB

给出了一个基环外向树,如何点分治?
把环干掉就是普通点分治了,所以先把环干掉再考虑环对子树的影响,去环这个过程可以并查集实现。
先普通点分治一遍,对于树的情况,直接输出,下面考虑环的情况。
从断点开始,扫一遍环上的外向树,只有这棵树里的点经断掉的边到其他外向树上的点才能计入答案,因为其他的情况在普通点分治里已经统计过了。这个可以用树状数组维护。
统计的是这棵外向树上的基点(就是在环上的点)到断点一端的距离和其余外向树到断点另一端的距离和大于等于k1 的情况数。
树状数组的维护可以很奇妙……
不要忘了开long long……
向因为被我霍霍坏了退役四天的TP默哀一秒……
Code

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章