正题

题目链接:https://www.luogu.com.cn/problem/P7581


题目大意

给出\(n\)个点的有边权有根树,\(m\)次询问一个节点\(x\)的所有\(k\)级儿子两两之间路径长度。

\(1\leq n,m\leq 10^6\)


解题思路

有根长剖,无根点分治。所以这题应该是长剖(?,先离线一下询问

然后略微分析一下,两两的路径长度所以需要合并两棵子树向上的路径,合并的时候又需要记录子树的\(k\)级儿子到该节点的距离和,还有\(k\)级儿子个数。

所以要记录三个东西,\(f_{i,j}\)表示\(i\)节点的\(j\)级儿子个数,\(g_{i,j}\)表示\(i\)节点的\(j\)级儿子到根的距离和,\(h_{i,j}\)表示\(i\)节点的\(j\)级儿子两两之间的路径。

然后这三个用长剖转移就好了。

时间复杂度\(O(n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
#define mp(x,y) make_pair(x,y)
#define lowbit(x) (x&-x)
using namespace std;
const ll N=1e6+10,P=1e9+7;
struct node{
ll to,next,w;
}a[N<<1];
ll n,m,tot,p[N],ls[N],ans[N],len[N],son[N],dis[N],F[N],G[N],H[N];
ll *now,*tmp,*buf,*f[N],*g[N],*h[N];
vector<pair<ll,ll> >v[N];
void addl(ll x,ll y,ll w){
a[++tot].to=y;
a[tot].next=ls[x];
ls[x]=tot;a[tot].w=w;
return;
}
void dfs(ll x,ll fa){
for(ll i=ls[x];i;i=a[i].next){
ll y=a[i].to;
if(y==fa)continue;
dis[y]=dis[x]+a[i].w;dfs(y,x);
if(len[y]>len[son[x]])son[x]=y;
}
len[x]=len[son[x]]+1;
return;
}
void solve(ll x,ll fa){
f[x][0]=1;g[x][0]=dis[x];
if(son[x]){
f[son[x]]=f[x]+1;
g[son[x]]=g[x]+1;
h[son[x]]=h[x]+1;
solve(son[x],x);
}
for(ll i=ls[x];i;i=a[i].next){
ll y=a[i].to;
if(y==fa||y==son[x])continue;
f[y]=now;now+=len[y];
g[y]=tmp;tmp+=len[y];
h[y]=buf;buf+=len[y];
solve(y,x);
for(ll j=0;j<len[y];j++){
ll t1=(g[x][j+1]-f[x][j+1]*dis[x])%P;
ll t2=(g[y][j]-f[y][j]*dis[x])%P;
(h[x][j+1]+=t1*f[y][j]%P+f[x][j+1]*t2%P)%=P;
(h[x][j+1]+=h[y][j])%=P;
(g[x][j+1]+=g[y][j])%=P;
f[x][j+1]+=f[y][j];
}
}
for(ll i=0;i<v[x].size();i++){
ll k=v[x][i].first,id=v[x][i].second;
if(k>=len[x])ans[id]=0;else ans[id]=h[x][k];
}
return;
}
signed main()
{
scanf("%lld%lld",&n,&m);
for(ll i=1;i<n;i++){
ll x,y,w;
scanf("%lld%lld%lld",&x,&y,&w);
addl(x,y,w);addl(y,x,w);
}
for(ll i=1;i<=m;i++){
ll x,k;
scanf("%lld%lld",&x,&k);
v[x].push_back(mp(k,i));
}
dfs(1,1);
now=f[1]=F;now+=len[1];
tmp=g[1]=G;tmp+=len[1];
buf=h[1]=H;buf+=len[1];
solve(1,1);
for(ll i=1;i<=m;i++)
printf("%lld\n",(ans[i]+P)%P);
return 0;
}

P7581-「RdOI R2」路径权值【长链剖分,dp】的更多相关文章

  1. 「vijos-bashu」lxhgww的奇思妙想(长链剖分)

    倍增离线,预处理出爹和孙子们.查询\(O(1)\) #include <cstdio> #include <cstring> #include <numeric> ...

  2. 【COGS2652】秘术「天文密葬法」(长链剖分,分数规划)

    [COGS2652]秘术「天文密葬法」(长链剖分,分数规划) 题面 Cogs 上面废话真多,建议直接拉到最下面看一句话题意吧: 给个树,第i个点有两个权值ai和bi,现在求一条长度为m的路径,使得Σa ...

  3. 「WC2010」重建计划(长链剖分/点分治)

    「WC2010」重建计划(长链剖分/点分治) 题目描述 有一棵大小为 \(n\) 的树,给定 \(L, R\) ,要求找到一条长度在 \([L, R]\) 的路径,并且路径上边权的平均值最大 \(1 ...

  4. 【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)

    LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们 ...

  5. 「NOIP2014」「Codevs3728」 联合权值(乱搞

    3728 联合权值 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold   题目描述 Description 输入描述 Input Description 输出描述 Ou ...

  6. 「NOIP2014」联合权值

    传送门 Luogu 解题思路 因为这是一棵树,所以说两个点如果能产生联合权值,那么它们就只能通过唯一的一个中转点来匹配,所以我们就枚举这个中转点. 但是我们又会发现,如果把每个点周围的点抠出来进行两两 ...

  7. HDU 5402 Travelling Salesman Problem (模拟 有规律)(左上角到右下角路径权值最大,输出路径)

    Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (J ...

  8. 「HAOI2015」「LuoguP3178」树上操作(树链剖分

    题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增 ...

  9. cogs 2652. 秘术「天文密葬法」(0/1分数规划 长链剖分 二分答案 dp

    http://cogs.pro:8080/cogs/problem/problem.php?pid=vSXNiVegV 题意:给个树,第i个点有两个权值ai和bi,现在求一条长度为m的路径,使得Σai ...

随机推荐

  1. docker部署minio

    快速部署 docker run -p 9000:9000 --name myminio \ -e "MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE" \ ...

  2. WPF 饼状图,柱形图,折线图 (3 饼状图)

    网址:https://www.cnblogs.com/CSSZBB/p/12746214.html 饼状图相对来说复杂一些.因为需要计算很多坐标,线来看下这个列子. 圆首先想到Ellipse.但是El ...

  3. spring cloud 项目

    ### 项目需求 客户端:针对普通用户,用户登录.用户退出.菜品订购.我的订单. 后台管理系统:针对管理员,管理员登录.管理员退出.添加菜品.查询菜品.修改菜品.删除菜品.订单处理.添加用户.查询用户 ...

  4. C# 正则表达式的重点知识 1

  5. jvm系列(六):jvm调优-工具篇

    ## jdk自带的工具### jconsole Jconsole(Java Monitoring and Management Console)是从java5开始,在JDK中自带的java监控和管理控 ...

  6. 【设计模式】java设计模式目录

    1.创建型模式 JDK1.5枚举Singleton    单例模式 AbstractFactory  工厂方法模式    简单工厂模式 Builder Prototype 2.结构型 java设计模式 ...

  7. 模拟文件上传(三):使用apache fileupload组件进行文件批量上传

    其中涉及到的jar包 jsp显示层: <%@ page language="java" import="java.util.*" pageEncoding ...

  8. Linux centos 安装 ftp(Vsftp) 与 设置ftp(Vsftp)

    本文章只是简单搭建,因为公司只须要简单使用,虽然简单但是之前也走了一些弯路,所以决定把过程记录下来. 一.Vsftp安装与卸载 安装:yum install vsftpd 卸载:yum remove ...

  9. 关于通用Mapper new Example使用记录

    关于通用MapperExample使用记录 环境准备 需要集成 mybatis 的 generator 插件,方便自动生成 实体类和 mapper 类,还可以生成xml,不过一般我们都不用 xml b ...

  10. 如何将excel中纵向的转换成横向保证格式不变,

    先选定,复制,然后用--编辑---选择性粘贴--转置--确定.试试能不能实现 ,能把文件发过来看一下​