【题解】Luogu P7359 「JZOI-1」旅行

news/2025/2/9 9:42:17/文章来源:https://www.cnblogs.com/zhangxyhp/p/18705763

考虑一次询问,显然 DP,设 \(f_{u,0/1}\) 表示走路/坐船到 \(u\) 点的最小花费即可。

多次询问,考虑维护矩阵,扩展矩阵快速幂,倍增处理询问。比如对于一条顺流的边 \(i\),可以构造矩阵:

\[\begin{bmatrix} a_i&L+a_i-z_i\\ a_i&a_i-z_i \end{bmatrix} \]

对每个点 \(u\) 维护 \(up_{u,i}\)\(dw_{u,i}\) 表示从 \(u\) 向上走到 \(2^i\) 级祖先的矩阵和从 \(2^i\) 级祖先向下走到 \(u\) 的矩阵。时间复杂度 \(O((N+T)\log N)\)

#include<bits/stdc++.h>
#define ll long long
#define il inlineusing namespace std;
namespace asbt{
namespace cplx{bool begin;}
const int maxn=2e5+5;
const ll inf=0x3f3f3f3f3f3f3f3f;
int n,m,q,enm,hd[maxn];
int anc[maxn][22],dep[maxn];
struct edge{int v,nxt;ll w,d;bool typ;
}e[maxn<<1];
il void addedge(int u,int v,ll w,ll d,bool typ){e[++enm]=(edge){v,hd[u],w,d,typ};hd[u]=enm;
}
struct juz{ll mat[2][2];juz(){mat[0][0]=mat[0][1]=mat[1][0]=mat[1][1]=0;}il ll*operator[](int x){return mat[x];}il juz operator*(juz x)const{juz res;res[0][0]=res[0][1]=res[1][0]=res[1][1]=inf;for(int i=0;i<=1;i++){for(int j=0;j<=1;j++){for(int k=0;k<=1;k++){res[i][j]=min(res[i][j],mat[i][k]+x[k][j]);}}}return res;}
}up[maxn][22],dw[maxn][22];
il void dfs(int u,int fa){anc[u][0]=fa,dep[u]=dep[fa]+1;for(int i=1;i<=20;i++){anc[u][i]=anc[anc[u][i-1]][i-1];up[u][i]=up[u][i-1]*up[anc[u][i-1]][i-1];dw[u][i]=dw[anc[u][i-1]][i-1]*dw[u][i-1];}for(int i=hd[u],v,w,d,typ;i;i=e[i].nxt){v=e[i].v,w=e[i].w,d=e[i].d,typ=e[i].typ;if(v==fa){continue;}up[v][0][0][0]=up[v][0][1][0]=w;dw[v][0][0][0]=dw[v][0][1][0]=w;if(typ){up[v][0][0][1]=m+w+d;up[v][0][1][1]=w+d;dw[v][0][0][1]=m+w-d;dw[v][0][1][1]=w-d;}else{up[v][0][0][1]=m+w-d;up[v][0][1][1]=w-d;dw[v][0][0][1]=m+w+d;dw[v][0][1][1]=w+d;}dfs(v,u);}
}
namespace cplx{bool end;il double usdmem(){return (&begin-&end)/1048576.0;}
}
int main(){ios::sync_with_stdio(0),cin.tie(0);cin>>n>>m>>q;for(int i=1,u,v,w,d,typ;i<n;i++){cin>>u>>v>>w>>d>>typ;addedge(u,v,w,d,typ);addedge(v,u,w,d,typ^1);}dfs(1,0);
//	for(int i=1;i<=n;i++){
//		for(int j=0;j<=1;j++){
//			cout<<up[i][j][0][0]<<" "<<up[i][j][0][1]<<" ";
//		}
//		puts("");
//		for(int j=0;j<=1;j++){
//			cout<<up[i][j][1][0]<<" "<<up[i][j][1][1]<<" ";
//		}
//		puts("");
//	}
//	for(int i=1;i<=n;i++){
//		for(int j=0;j<=1;j++){
//			cout<<dw[i][j][0][0]<<" "<<dw[i][j][0][1]<<" ";
//		}
//		puts("");
//		for(int j=0;j<=1;j++){
//			cout<<dw[i][j][1][0]<<" "<<dw[i][j][1][1]<<" ";
//		}
//		puts("");
//	}while(q--){int u,v;cin>>u>>v;if(u==v){cout<<"0\n";continue;}juz resu,resv;bool flu=0,flv=0;if(dep[u]>dep[v]){int ddep=dep[u]-dep[v],tmp=0;while(ddep){if(ddep&1){if(!flu){resu=up[u][tmp];flu=1;}else{resu=resu*up[u][tmp];}u=anc[u][tmp];}ddep>>=1,tmp++;}if(u==v){cout<<min(resu[0][0],resu[0][1])<<"\n";continue;}}else{int ddep=dep[v]-dep[u],tmp=0;while(ddep){if(ddep&1){if(!flv){resv=dw[v][tmp];flv=1;}else{resv=dw[v][tmp]*resv;}v=anc[v][tmp];}ddep>>=1,tmp++;}if(u==v){cout<<min(resv[0][0],resv[0][1])<<"\n";continue;}}
//		for(int i=0;i<=1;i++){
//			for(int j=0;j<=1;j++){
//				cout<<resu[i][j]<<" ";
//			}
//			puts("");
//		}
//		for(int i=0;i<=1;i++){
//			for(int j=0;j<=1;j++){
//				cout<<resv[i][j]<<" ";
//			}
//			puts("");
//		}for(int i=20;~i;i--){if(anc[u][i]!=anc[v][i]){if(!flu){resu=up[u][i];flu=1;}else{resu=resu*up[u][i];}if(!flv){resv=dw[v][i];flv=1;}else{resv=dw[v][i]*resv;}u=anc[u][i],v=anc[v][i];}}if(!flu){resu=up[u][0];}else{resu=resu*up[u][0];}if(!flv){resv=dw[v][0];}else{resv=dw[v][0]*resv;}juz res=resu*resv;cout<<min(res[0][0],res[0][1])<<"\n";}return 0;
}
}
int main(){return asbt::main();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/881126.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于AI生成艺术、自动驾驶汽车和Nutella片

Foto di Barbara Zandoval su Unsplash前言:当前时代人们似乎仍然坚信AI没有人类这样的创造力的!那人类的创造力又是什么呢?不也是从开始拥有认识能力,然后逐渐进化到现在空前的创造力的吗?如果AI也自我进化,创造力又能意味着什么? 我是个万事通。作为一名自由职业的在线…

MathType 7.4下载与安装

《数学公式编辑器(MathType)》 [1]是一款专业的数学公式编辑工具,理科生专用的工具。mathtype公式编辑器能够帮助用户在各种文档中插入复杂的数学公式和符号。 数学公式编辑器工具可以轻松输入各种复杂的公式和符号,与Office文档完美结合,显示效果超好,比Office自带的公式编…

支付流程设计常见问题及最佳实践

在实际操作中,支付流程常常面临诸多问题。本文将深入探讨支付流程设计中的常见问题及其最佳实践,供大家参考。今天聊一下支付流程设计的一些常见总是及最佳实践,包括: 组合支付要不要拆支付流水,前端轮询查哪个域,查询要不要穿透到外部渠道,为什么要做同步受理异步处理,…

原 侧边栏公告

<!-- 配置项详情见 https://bndong.github.io/Cnblogs-Theme-SimpleMemory/v2/#/Docs/Customization/config --><script type="text/javascript"> window.cnblogsConfig = {info: {name: , //「待填内容」 用户名startDate: , //「待填内容」 入园时间,…

读算法简史:从美索不达米亚到人工智能时代11搜索网络

20世纪70年代小型计算机普及,苹果推出Apple和Macintosh;蒂姆伯纳斯-李提出万维网,改变了网络访问方式;亚马逊采用个性化推荐算法;谷歌开发PageRank算法,引领网络搜索和关键字广告。1. 小型计算机 1.1. 到了20世纪70年代,小型计算机已在科研院所、大学和大公司中广泛应用…

Roslyn 源代码生成器 SourceGenerator 获取代码文件的本地绝对路径

本文告诉大家如何在源代码生成器 SourceGenerator 里面获取代码文件的本地文件的绝对路径从 compilation 的 Options 拿到 SourceReferenceResolver 对象,调用其 NormalizePath 方法,传入 SyntaxTree 的 FilePath 参数即可 正常项目的 SourceReferenceResolver 都是存在的,尽…

纯 CSS 来计算当前窗口的宽高

在平时我想要计算浏览器窗口的宽度高度的时候,我们会使用 resize 事件去获取,也就是 JavaScript 的方式去获取窗口的宽度高度。 今天给大家分享一个使用纯 CSS 就能计算窗口宽度高度的方法定义自定义属性: 使用@property规则来定义--vw和--vh作为自定义的CSS属性。这些属性…

宏定义

宏定义 # 和 ## #号(将符号转为字符串) 这条定义中,定义了一个 PRINT 的宏函数预处理器遇到这样的宏,会将 #a 替换成以字符串表示的参数 a 例如:##号(连接符:将2个表达式连接到一起)预处理器会将这2条宏扩展成下面的代码我们可以看到:这2条宏定义其实就是定义了2个成员…

《Operating System Concepts》阅读笔记:p2-p8

《Operating System Concepts》学习第 2 天,p2-p8 总结,总计 7 页。 一、技术总结 1.operating system An operating system is software that manages a computer’s hardware。 2.system bus data bus, address bus, control bus 统称为 system bus。 二、英语总结(生词:…

踩坑---中断中调用系统定时器延时卡死

踩坑---中断中调用系统定时器延时卡死 背景 ​ 配置外部中断作为按键输入时,调用了系统滴答定时器为基准的延时。然后每次一按按键,单片机就卡死。一开始怀疑时中断没有配置好。反复研究中断配置是否出现错误,最后debug出来,发现卡在了// 3. 等待计数值变为0,判断CTRL标志…

windows 10 安装 wsl

在 windows 上安装 Debian 版本的 wsl以管理员身份运行 cmd,执行 wsl --help 可查看 wsl 的帮助信息。执行 wsl --list --online 查看可供安装的 wsl子系统 版本。执行 wsl --install --distribution Debian 安装 debian 版本的 wsl有了计划记得推动,不要原地踏步。

开学作业13

学习使用了vue中watch知识 可以实时更新数据 也非常好用