正题

题目链接: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. C#:[StructLayout(LayoutKind.Sequential)]

    参考网址: https://blog.csdn.net/hongkonglife/article/details/23422857 结构体是由若干成员组成的.布局有两种1.Sequential,顺序布 ...

  2. [SWMM]模型子汇水区划分的几种方法

    子汇水区的划分是SWMM模型建模的主要步骤之一,划分的好坏对结果精度有比较大的影响.概括来讲,子汇水区的划分有以下几种思路: (1)根据管网走向.建筑物和街道分布,直接人工划分子汇水区.这个方法适用于 ...

  3. Android Studio 百度地图导航

    配置就不再多说了,上一篇已经详细说过了,这次就是根据经纬度坐标做地图导航,路径规划.直接上代码: package com.example.appview.mian_page.Frament.Anzhu ...

  4. 编写你的第一个Django应用

    安装 Python 作为一个 Python Web 框架,Django 需要 Python.更多细节请参见 我应该使用哪个版本的 Python 来配合 Django?. Python 包含了一个名为  ...

  5. MySQL-SQL基础-查询2

    mysql> create table customer(mid char(5) primary key,th date,sex char(1) default '0'); Query OK, ...

  6. Python之requests模块-response

    response类故名思议,它包含了服务器对http请求的响应.每次调用requests去请求之后,均会返回一个response对象,通过调用该对象,可以查看具体的响应信息. 示例如下: import ...

  7. 性能测试工具JMeter 基础(三)—— 创建测试计划

    如何创建一个完整的测试计划? 安装好JMeter后,通过根目录下的bin目录中的jmeter.bat启动JMeter 添加线程组(Thread Group) 在 Test Plan 鼠标右键 Add- ...

  8. python3 爬虫五大模块之三:网页下载器

    Python的爬虫框架主要可以分为以下五个部分: 爬虫调度器:用于各个模块之间的通信,可以理解为爬虫的入口与核心(main函数),爬虫的执行策略在此模块进行定义: URL管理器:负责URL的管理,包括 ...

  9. 配置IIS Express 允许外部访问

    修改applicationhost.config 配置允许外部访问 操作步骤: 1. 查看本机IP地址记录IP地址,例如:10.1.20.138 2. 如下图,找到要发布的站点的名称 记录站点的名称, ...

  10. [第十六篇]——Docker 安装 CentOS之Spring Cloud直播商城 b2b2c电子商务技术总结

    Docker 安装 CentOS CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise ...