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

题目描述 Description

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

输入 Input

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

输出 Output

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

样例输入 Sample Input

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

样例输出 Sample Output

20

提示 Hint

Hint

限制 Limits

n ≤ 1 0 5 , k ≤ n n\le 10^5,k\le n n105,kn m m m的要求如输入
Time Limit : 4s & Memory Limit : 512MB

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值