P7581-「RdOI R2」路径权值【长链剖分,dp】
正题
题目链接: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】的更多相关文章
- 「vijos-bashu」lxhgww的奇思妙想(长链剖分)
倍增离线,预处理出爹和孙子们.查询\(O(1)\) #include <cstdio> #include <cstring> #include <numeric> ...
- 【COGS2652】秘术「天文密葬法」(长链剖分,分数规划)
[COGS2652]秘术「天文密葬法」(长链剖分,分数规划) 题面 Cogs 上面废话真多,建议直接拉到最下面看一句话题意吧: 给个树,第i个点有两个权值ai和bi,现在求一条长度为m的路径,使得Σa ...
- 「WC2010」重建计划(长链剖分/点分治)
「WC2010」重建计划(长链剖分/点分治) 题目描述 有一棵大小为 \(n\) 的树,给定 \(L, R\) ,要求找到一条长度在 \([L, R]\) 的路径,并且路径上边权的平均值最大 \(1 ...
- 【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)
LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们 ...
- 「NOIP2014」「Codevs3728」 联合权值(乱搞
3728 联合权值 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 输入描述 Input Description 输出描述 Ou ...
- 「NOIP2014」联合权值
传送门 Luogu 解题思路 因为这是一棵树,所以说两个点如果能产生联合权值,那么它们就只能通过唯一的一个中转点来匹配,所以我们就枚举这个中转点. 但是我们又会发现,如果把每个点周围的点抠出来进行两两 ...
- HDU 5402 Travelling Salesman Problem (模拟 有规律)(左上角到右下角路径权值最大,输出路径)
Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (J ...
- 「HAOI2015」「LuoguP3178」树上操作(树链剖分
题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增 ...
- cogs 2652. 秘术「天文密葬法」(0/1分数规划 长链剖分 二分答案 dp
http://cogs.pro:8080/cogs/problem/problem.php?pid=vSXNiVegV 题意:给个树,第i个点有两个权值ai和bi,现在求一条长度为m的路径,使得Σai ...
随机推荐
- [C#]c#中数据的同步加锁机制 的几种方法
一,锁定机制最简单的做法就是使用锁定关键字Lock.Lock关键字英文中就是锁的意思,顾名思义就是为操作加上一把锁.它的语法如下: lock(lockObj){//加锁的代码段,一般是操作共同资源的代 ...
- MVVMLight学习笔记(二)---MVVMLight框架初探
一.MVVM分层概述 MVVM中,各个部分的职责如下: Model:负责数据实体的结构处理,与ViewModel进行交互: View:负责界面显示,与ViewModel进行数据和命令的交互: View ...
- mfc HackerTools远程线程注入
在一个进程中,调用CreateThread或CreateRemoteThreadEx函数,在另一个进程内创建一个线程(因为不在同一个进程中,所以叫做远程线程).创建的线程一般为Windows API函 ...
- spring boot集成pagehelper(两种方式)
当spring boot集成好mybatis时候需要进行分页,我们首先添加maven支持 <dependency> <groupId>com.github.pagehelper ...
- Linux centos 安装 Node.js
官网下载地址 https://nodejs.org/zh-cn/download/ 1.下载二进制文件 (x64) 相当于 https://nodejs.org/dist/v10.16.3/no ...
- Go测试--main测试
目录 简介 示例 简介 子测试的一个方便之处在于可以让多个测试共享Setup和Tear-down.但这种程度的共享有时并不满足需求,有时希望在整个测试程序做一些全局的setup和Tear-down,这 ...
- IDEA常用设置及推荐插件
IDEA常用设置及推荐插件 本文主要记录IDEA的一些常用设置,IDEA与Eclipse的常用快捷键对比及推荐一些好用的插件. 基本设置 设置界面风格及修改外部UI尺寸大小 打开IDEA时设置不重新打 ...
- zap高性能日志
摘要 日志在整个工程实践中的重要性不言而喻,在选择日志组件的时候也有多方面的考量.详细.正确和及时的反馈是必不可少的,但是整个性能表现是否也是必要考虑的点呢?在长期的实践中发现有的日志组件对于计算资源 ...
- JAVA 之 每日一记 之 算法( 给你一个Excel表列序号,返回出它对应的数字 )
代码结果:(只想要代码的可以离开了,代码给你了,绝对能用的.想要思路的往下看.) class Solution { public int titleToNumber(String s) { int a ...
- Linux - last 命令(Mac 电脑)
前言 为啥写这篇? 因为听 grep.sed 教程的时候有这个命令栗子 加上工作中,运维给我排查问题的时候也用到了,感觉挺重要,先了解为敬! 命令作用 显示用户和TTY的最后登录次数 这个是在 Mac ...