【GDOI2017模拟二试4.12】树上路径

这是一篇关于无根树上路径价值计算的问题解析,其中路径价值定义为点权和减去最大点权。文章介绍了如何利用点剖方法解决当路径价值为给定倍数时,满足条件的不同简单路径数量的问题。数据约束包括n≤10^5,p≤10^7,val_i≤10^9。作者提供了思路和代码实现,特别强调了处理相同直系儿子边的去重操作。
摘要由CSDN通过智能技术生成

Description

给定一颗n个结点的无根树,树上的每个点有一个非负整数点权,定义一条路径的价值为路径上的点权和-路径的点权最大值。
给定参数p,我们想知道,有多少不同的树上简单路径,满足它的价值恰好是p的倍数。
注意:单点算作一个路径;u ≠ v时,(u,v)和(v,u)只算一次。
Data Constraint

对所有测试点,我们有:
n≤10^5,p≤10^7,val_i≤10^9

这里写图片描述
Hint

满足条件的路径有:(1,1),(2,2),(3,3),(4,4),(5,5),(1,4),(2,3),(2,5),(3,5)。

题解

考虑点剖
对于当前的一个重心,我们可以先处理出它到子树中每一条边的点权和以及点权的最大值,然后我们可以按点权最大值的大小排一次序,假设我们现在做到第i条边,则我们可以把前i-1条边放到一个桶里面,然后如果我们现在选两条边,较大那条一定是现在做到的那条边的最大值,然后就可以通过桶快速计算答案
注意点剖中两条边在同一个直系儿子的情况,所以再做一遍去重就好了

贴代码

var
    a,b,s,cc:array[0..200005,1..2]of longint;
    va,size,vis,dis:array[0..100005]of longint;
    tong:array[0..10000005]of longint;
    i,j,k,l,m,n,p,x,y,ma,t1,root:longint;
    ans:int64;
function max(x,y:longint):longint;
begin
    if x>y then exit(x) else exit(y);
end;
procedure qsort(l,r:longint);
var
    i,j,mid:longint;
begin
    i:=l;
    j:=r;
    mid:=a[(l+r) div 2,1];
    repeat
        while
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值