P11179 [ROIR 2018 Day1] 管道监控 题解

news/2024/12/12 21:56:57/文章来源:https://www.cnblogs.com/STARSczy/p/18603529

题解:P11179 [ROIR 2018 Day1] 管道监控

秒秒题。没有题解呢,来发一发。建议降蓝

思路

发现往下匹配路径不好处理,于是反转每个路线的字符串,然后从下往上移动覆盖,这样定了一个方向。

若只输出最小值,就从下往上 dp,发现可以 $n^3$ 处理,猜测正解设两维状态,$\Theta(n)$ 合并。第一维肯定是当前节点 $x$ 为根的子树内的所有边都被覆盖完,第二维容易想到是节点 $x$ 往上的 $k$ 个节点也被覆盖到了。设当前节点有儿子 $u$,容易有转移:$f_{x,\max(i,j)} \to f_{x,i}+f_{u,j+1} $,转移方式为取 $\min$。

于是直接 dp 即可。如果要输出方案,直接对于每个状态存储方案,由于最终路线 $n$ 条就可以覆盖完,所以可以直接存储。

代码:

#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#include<ext/rope>
#define rep(i,l,r) for(int i=(l),i##end=(r);i<=i##end;++i)
#define per(i,r,l) for(int i=(r),i##end=(l);i>=i##end;--i)
#define int long long
#define double long double
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define rbtree(way) tree<way,null_type,less<way>,rb_tree_tag,tree_order_statistics_node_update>
using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
const int maxn=500+10,maxm=1e5+10,mod=998244353,inf=1e15;
inline int ksm(int x,int k,int mod=mod){int ans=1;for(;k;k>>=1,x=x*x%mod) if(k&1) ans=ans*x%mod;return ans;
}int n,m,opt,tot=1,fa[maxn],g[maxn],dep[maxn],f[maxn][maxn],tr[maxm*10][30];
pii ed[maxm*10];
vector<pii> dp[maxn][maxn],rmg[maxn];
char c[maxn];
vector<int> e[maxn];
string s[maxm];
void dfs(int x){rep(i,1,dep[x]) f[x][i]=inf;for(int u:e[x]){dep[u]=dep[x]+1,dfs(u);rep(i,0,n) g[i]=f[x][i],rmg[i]=dp[x][i],f[x][i]=inf,dp[x][i].clear();rep(i,0,dep[x]) rep(j,0,dep[x]) f[x][max(i,j)]=min(f[x][max(i,j)],g[i]+f[u][j+1]);rep(i,0,dep[x]) rep(j,0,dep[x]) if(f[x][max(i,j)]<inf&&f[x][max(i,j)]==g[i]+f[u][j+1]&&!dp[x][max(i,j)].size()) dp[x][max(i,j)]=rmg[i],dp[x][max(i,j)].insert(dp[x][max(i,j)].end(),dp[u][j+1].begin(),dp[u][j+1].end());}for(int i=x,k=0,nw=1,tmp=0;i&&nw;nw=tr[nw][c[i]-'a'],i=fa[i],++k){if(ed[nw].fi+f[x][tmp]<f[x][k])f[x][k]=ed[nw].fi+f[x][tmp],dp[x][k]=dp[x][tmp],dp[x][k].pb({x,ed[nw].se});if(f[x][k]<f[x][tmp]) tmp=k;}
}signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n>>m>>opt;rep(i,2,n) cin>>fa[i]>>c[i],e[fa[i]].pb(i);rep(i,1,m){int val,nw=1;cin>>val>>s[i],reverse(s[i].begin(),s[i].end());for(char c:s[i]) !tr[nw][c-'a']?ed[tr[nw][c-'a']=++tot]={inf,0},0:0,nw=tr[nw][c-'a'];ed[nw]=min(ed[nw],{val,i});}dfs(1);if(f[1][0]>=inf) return cout<<-1,0;cout<<f[1][0]<<'\n';if(opt==1){cout<<dp[1][0].size()<<'\n';for(pii x:dp[1][0]){int k=x.fi;rep(i,1,s[x.se].size()) k=fa[k];cout<<k<<" "<<x.fi<<" "<<x.se<<"\n";}}return 0;
}

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

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

相关文章

APP 内存泄露优化

原理 https://juejin.cn/post/6864492188404088846 分析 我的APP主要的VC路径如下:如果没有内存泄露的话,我们从一个VC_A开始push一个VC_B,无论在VC_B操作了什么,pop回到VC_A,这个时候的内存大小应该和VC_A在puhs VC_B的时候是一样大的。 如图: 页面结构:曲谱列表 push 曲…

VMware ESXi 8.0U3c macOS Unlocker OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)

VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0U3 集成驱动版,在个人电脑上运行企业级工作负载 请访问原文链接:…

12.12实验八:随机森林算法实现与测试

实验八:随机森林算法实现与测试 一、实验目的 深入理解随机森林的算法原理,进而理解集成学习的意义,能够使用 Python 语言实现随机森林算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。二、实验内容 (1)从 scikit-learn 库中加载 iris 数据集,使用留出法…

VMware ESXi 8.0U3c 发布 - 领先的裸机 Hypervisor

VMware ESXi 8.0U3c 发布 - 领先的裸机 HypervisorVMware ESXi 8.0U3c 发布 - 领先的裸机 Hypervisor 同步发布 Dell (戴尔)、HPE (慧与)、Lenovo (联想)、IEIT SYSTEMS (浪潮信息)、Cisco (思科)、Fujitsu (富士通)、Hitachi (日立)、NEC (日电)、Huawei (华为)、xFusion (超聚…

VMware ESXi 8.0U3c macOS Unlocker OEM BIOS 2.7 标准版和厂商定制版

VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版 ESXi 8.0U3 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、IEIT SYSTEMS (浪潮信息)、Cisco (思科)、Fujitsu (富士通…

使用Flex布局的几个小技巧

前情 Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性,任何一个容器都可以指定为 Flex 布局,如果说目前我开发中离不开的布局方式那就非Flex莫属了,而且小程序就是推荐使用Flex布局的,对 Grid布局的支持不太理想。 在一次次使用fl…

C#学习笔记(一) Array学习笔记

之前一直学习各种基础知识,光学习,没有总结,趁着有时间,总结总结C#有关知识 Array类是最基础的数组类,官方文档截图如下:Array是一个抽象类,不能实例化,只能使用里面的方法,属性。 Array 类不是 System.Collections 命名空间的一部分。 但是,它仍被视为集合,因为它基…

VMware ESXi 7.0U3r macOS Unlocker OEM BIOS 2.7 标准版和厂商定制版

VMware ESXi 7.0U3r macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版VMware ESXi 7.0U3r macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版 ESXi 7.0U3 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科)、Fujitsu (富士通)、Hitachi…

Ubuntu 20.04虚拟机无法上网,无法访问主机

查版本 Ubuntu基于Debian发行版和GNOME桌面环境 Xubuntu(发音为ZOO-bun-too)是一个Ubuntu Linux的官方派生版,它基于桌面环境Xfce,主要运行基于GTK+的程序,面向旧式电脑的用户和寻求更快捷的桌面环境的用户。它与Ubuntu不完全相同,但使用Ubuntu的高质量软件源。 /etc/net…

帮助用户与 AI 实时练习口语,Speak 为何能估值 10 亿美元?丨Voice Agent 学习笔记

👋活动招募:如果你正在关注 Voice Agent 的开发和创业,欢迎线上参与本周日(15 日)的 Voice Agent 开发者分享会。AI 语言学习公司 Speak 近日宣布完成 7800 万美元 C 轮融资,由 Accel 领投,OpenAI 创业基金、Khosla Ventures、Y Combinator 等顶级投资机构参投。此轮融…

12C++循环结构-for循环(2)——教学

1、循环变量为字符型; 2、打擂台-for语句的另一种形式; 3、break语句; 4、数位分离一、循环变量为字符型 试编一程序,按字典顺序输出26个字母。 流程图:思考:先顺序输出26个小写英文字母,再逆序输出26个大写英文字母。 循环可以是递增型循环,也可以是递减型循环。二、打…

沈阳在线教育系统官网

针对教育和软件行业的关注,在不断发展的市场环境下,我们探讨一种新兴的趋势,即在线教育领域如何更高效、更个性化地提供优质的教育服务,尤其是利用知识付费在线教育系统的创新解决方案。图源 凸知@www.tuzhi.ltd在当前社会背景下,随着信息技术的突飞猛进,以及人们对于优质…