点分治 水题集合

由于考场上想出点分治可是不会写(2333 蒟蒻花了一天写点分治qwq

3365: [Usaco2004 Feb]Distance Statistics 路程统计

Time Limit: 10 Sec   Memory Limit: 128 MB
Submit: 389   Solved: 224
[ Submit][ Status][ Discuss]

Description

    在得知了自己农场的完整地图后(地图形式如前三题所述),约翰又有了新的问题.他提供

一个整数K(1≤K≤109),希望你输出有多少对农场之间的距离是不超过K的.

Input

    第1到I+M行:与前三题相同;
    第M+2行:一个整数K.

Output

 

    农场之间的距离不超过K的对数.

Sample Input


7 6
1 6 13 E
6 3 9 E
3 5 7 S
4 1 3 N
2 4 20 W
4 7 2 S
10

Sample Output


5

有五对道路之间的距离小于10
1-4,距离为3
4-7,距离为2
1-7,距离为5
3-5,距离为7
3-6,距离为9

HINT


Source



HOME
Back

Solution

我们通过递归的方式不断地找子树的重心,递归解决问题,通过dfs更新子树中到重心的距离,从小到大排序,统计答案。


2599: [IOI2011]Race

Time Limit: 70 Sec   Memory Limit: 128 MB
Submit: 4692   Solved: 1377
[ Submit][ Status][ Discuss]

Description

给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000


Input

第一行 两个整数 n, k
第二..n行 每行三个整数 表示一条无向边的两端和权值 (注意点的编号从0开始)

Output

一个整数 表示最小边数量 如果不存在这样的路径 输出-1

Sample Input


4 3
0 1 1
1 2 2
1 3 4

Sample Output


2

HINT


 2018.1.3新加数据一组,未重测

Source


[ Submit][ Status][ Discuss]



Solution

这道题目稍微有点麻烦,我们需要用t[v]表示距离重心权值和为v边数最少的点的边数(有点绕口)那么还是对于每个子树递归解决问题,找到重心dfs更新信息(注意:d更新完之后还是需要还原回来的!(这个调了好久


Problem 2152. – 聪聪可可

2152: 聪聪可可

Time Limit: 3 Sec   Memory Limit: 259 MB
Submit: 4593   Solved: 2391
[ Submit][ Status][ Discuss]

Description

聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃、两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏。他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个“点”,并用n-1条“边”把这n个“点”恰好连通(其实这就是一棵树)。并且每条“边”上都有一个数。接下来由聪聪和可可分别随即选一个点(当然他们选点时是看不到这棵树的),如果两个点之间所有边上数的和加起来恰好是3的倍数,则判聪聪赢,否则可可赢。聪聪非常爱思考问题,在每次游戏后都会仔细研究这棵树,希望知道对于这张图自己的获胜概率是多少。现请你帮忙求出这个值以验证聪聪的答案是否正确。

Input

输入的第1行包含1个正整数n。后面n-1行,每行3个整数x、y、w,表示x号点和y号点之间有一条边,上面的数是w。

Output

以即约分数形式输出这个概率(即“a/b”的形式,其中a和b必须互质。如果概率为1,输出“1/1”)。

Sample Input


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

Sample Output


13/25
【样例说明】
13组点对分别是(1,1) (2,2) (2,3) (2,5) (3,2) (3,3) (3,4) (3,5) (4,3) (4,4) (5,2) (5,3) (5,5)。

【数据规模】
对于100%的数据,n<=20000。

HINT


Source


[ Submit][ Status][ Discuss]

HOME
Back

Solution

对于这题,套路还是之前的套路,但是处理的方式稍微有点不同。我们dfs处理其中余1的个数,余2的个数,余0的个数(用a[x]表示),那么答案就是 a[0]a[0]+2a[1]a[2] a [ 0 ] ∗ a [ 0 ] + 2 ∗ a [ 1 ] ∗ a [ 2 ] 因为1,2与2,1算两种!

小个结吧

点分治这个东西有点暴力,但是我们每次都找重心保证了复杂度,是处理树上路径问题的利器。
首先每一条路径要么经过该点,要么经过其儿子。经过其儿子的我们递归处理,那么我们考虑处理经过该点的路径。
我们用dfs统计整棵树到根的答案,然后统计。那么我们发现可能存在路径两个点的lca不在该点上,那么我们就需要减去这一部分答案。
(蒟蒻水平不足,请大佬指教 逃

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值