2022 CCPC 绵阳站 E题 (图上DP,根号分治)

2022 CCPC 绵阳站 E题 (图上DP,根号分治)

题意

有一个由 n n n城市组成的国家,城市之间由一条权值为 w w w的边连接,共m条这样的边,并且保证整个国家是连通的。每个城市中有 a i a_i ai 个居民。

在接下来的q天,每天都会有一个城市遭受灾难 b 1 , b 2 , . . . , b q b_1,b_2,...,b_q b1,b2,...,bq,你必须将该城市的所有人都转移到其它城市才能避免居民受到灾难,转移一个居民到相邻城市的代价为两个城市之间路径的权值w。

请问你最少需要多少代价才能让所有居民都安全度过q天的灾难。

思路

我们不必管每个城市中有多少个人,我们只需要求出每个城市中转移一个人的最小代价,在最终计算总代价时再乘上人数即可。很容易想到一个暴力的DP解法如下:

f ( i , j ) f(i,j) f(i,j) 表示在第 j j j号点,第 i i i天后所有的操作中最小的代价。那么有 f ( i , j ) = M I N ( v , w ) ∈ e d g e b i { w + f ( i + 1 , v ) } f(i,j) = MIN_{(v,w) \in edge_{b_i}}\{w+f(i+1,v)\} f(i,j)=MIN(v,w)edgebi{w+f(i+1,v)}

我们发现每天只会更新一个dp值,于是我们可以直接省去f的第一维,然后倒序枚举天数 $i $ 从 q q q 1 1 1 。 总的时间复杂度为 O ( ∑ i = 1 q d e g ( b i ) O(\sum_{i=1}^q deg(b_i) O(i=1qdeg(bi) ,我们发现当 b i b_i bi 的度较大时,复杂度会退化到 O ( q n ) O(qn) O(qn) 这是不被允许的。

于是考虑根号分治,设分治边界为 S Q SQ SQ ,那么当 d e g ( b i ) ≤ S Q deg(b_i) \le SQ deg(bi)SQ 时,枚举他的所有边来更新dp, 如果 d e g ( b i ) > S Q deg(b_i) > SQ deg(bi)>SQ 那么我们为这个节点建立一个multiset ,存储所有邻边的 d p [ v ] + w dp[v]+w dp[v]+w 的值,则multiset的第一项即为当前最小的dp值。每当一个节点的dp值更新时,将与他相邻的 d e g ( v ) > S Q deg(v) > SQ deg(v)>SQ的点更新。

S Q = 2 × m × l o g n SQ = \sqrt{2 \times m \times logn} SQ=2×m×logn 时,复杂度为 O ( q m × l o g n ) O(q\sqrt{m \times logn}) O(qm×logn )

代码

#include<bits/stdc++.h>
using namespace std;
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define int long long
#define rep(i,l,r) for(int i = l;i<=r;i++)
#define per(i,r,l) for(int i = r;i>=l;i--)
const int INF = 0x3f3f3f3f3f3f3f3f;
typedef pair<int,int> PII;
int a[100005];
vector<PII> edge[100005];
vector<PII> edgeB[100005];
int deg[100005];
int que[100005];
int dp[100005];
multiset<int> mulst[100005];
const int mod = 998244353;
void solve(){int n,m,q;cin>>n>>m>>q;int SQ = sqrt(2LL * m * log2(n));for(int i = 1;i<=n;i++){cin >> a[i];}for(int i = 1;i<=m;i++){int u,v,w;cin>>u>>v>>w;edge[u].push_back({v,w});edge[v].push_back({u,w});deg[v]++;deg[u]++;}for(int u = 1;u<=n;u++){if(deg[u] > SQ){for(auto [v,w] : edge[u]){if(deg[v] > SQ){edgeB[u].push_back({v,w});}mulst[u].insert(w);}}}for(int i = 1;i<=q;i++){cin>>que[i];}for(int i = q;i>=1;i--){int u = que[i];if(deg[u] <= SQ){int cost = INF;for(auto [v,w] : edge[u]){cost = min(cost,dp[v]+w);}for(auto [v,w] : edge[u]){if(deg[v] > SQ){mulst[v].erase(mulst[v].find(w+dp[u]));mulst[v].insert(w+cost);}}dp[u] = cost;}else{int cost = *mulst[u].begin();for(auto [v,w] : edgeB[u]){if(deg[v] > SQ){mulst[v].erase(mulst[v].find(w+dp[u]));mulst[v].insert(w+cost);     }}dp[u] = cost;}}int ans = 0;for(int i = 1;i<=n;i++){ans = (ans + dp[i] * a[i]) %mod; }cout<<ans;
}
signed main(){int T = 1;// cin>>T;while(T--){solve();}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Ollama—87.4k star 的开源大模型服务框架!!

这一年来&#xff0c;AI 发展的越来越快&#xff0c;大模型使用的门槛也越来越低&#xff0c;每个人都可以在自己的本地运行大模型。今天再给大家介绍一个最厉害的开源大模型服务框架——ollama。 项目介绍 Ollama 是一个开源的大语言模型&#xff08;LLM&#xff09;服务工具…

mysql中的EXISTS和NOT EXISTS使用详解

本文来编写一个实例说下mysql中的EXISTS和NOT EXISTS使用详解 文章目录 exists用法SQL中in, not in, exists, not exists的区别使用实例本文小结 exists用法 exists: 如果括号内子查询语句返回结果不为空&#xff0c;说明where条件成立&#xff0c;就会执行主SQL语句。如果括号…

海量数据去重的哈希与布尔过滤器

目录 散列表 hash与平衡二叉树比较: 散列表组成: hash函数 作用&#xff1a; 怎么选择hash&#xff1a; 选择标准: 常用hash: hash的操作: hash冲突 产生原因 如何描述冲突程度: 解决冲突: 在合理范围内:used < size: 不在合理范围内&#xff08;used > s…

快速掌握——python类 封装[私有属性方法]、继承【python进阶】(内附代码)

1.类的定义 与 实例化对象 在python中使用class关键字创建一个类。 举例子 class Stu(object):id 1001name 张三def __init__(self):passdef fun1(self):pass# 实例化对象 s1 Stu() s2 Stu() print(s1.name) print(s2.name) 第一个方法 __init__是一种特殊的方法&#x…

PO 证书链

提到服务器间证书交换会不会头大,这两天遇到一个B2B接口的通讯证书问题,借机涨姿势,分享之 通常服务器之间通讯证书使用有两种方式: 如果不是生产机,可以简单的使用自签名证书,自签名证书就是下面这两个信息相同,都是自己,工具这里就不介绍了,多的是。双方互换证书,你…

HarmonyOS App 购物助手工具的开发与设计

文章目录 摘要引言功能需求分析技术方案与设计架构设计技术选型 代码示例Demo数据抓取模块数据存储模块历史价格查询和数据可视化模块完整界面布局和调用示例代码详解 QA环节总结参考资料 摘要 随着促销活动的增多&#xff0c;用户面临真假折扣的困惑&#xff0c;特别是在一些…

MPTCP协议

介绍 多路径TCP或 MPTCP协议是标准的扩展传输控制协议并在中进行了描述 RFC 8684号文件它允许设备同时使用多个接口通过单个MPTCP连接发送和接收TCP数据包。MPTCP可以聚合多个接口的带宽&#xff0c;也可以选择延迟最低的接口。它还允许在一条路径断开时进行故障切换&#xff…

1. 初始认识 Spring Cloud

1. 初始认识 Spring Cloud 文章目录 1. 初始认识 Spring Cloud前言2. Spring Cloud 基本介绍3. 系统架构的演变过程3.1 单机架构3.2 动静分离架构&#xff1a;静态缓存 文件存储3.3 分布式架构&#xff1a;业务拆分 负载均衡3.4 微服务架构&#xff1a;使用 Spring Cloud 4. …

网络学习第四篇

引言&#xff1a; 我们在第三篇的时候出现了错误&#xff0c;我们要就行排错&#xff0c;那么我们要知道一下怎么配置静态路由实现ping通&#xff0c;这样子我们才知道下一跳到底是什么&#xff0c;为什么这样子做。 实验目的 理解和掌握静态路由的基本概念和配置方法。 实…

【rf】robotframework自动化测试环境搭建

robotframework自动化测试环境搭建 前言&#xff1a; 1、在2019年之前&#xff0c;robotframework-ride的版本一直是1.5.2.1&#xff0c;是2016年1月份的版本&#xff0c;只能安装在python2.7的环境上&#xff0c;导致如果想同时使用robotframework做测试且又需要python3环境…

opencv入门学习总结

opencv学习总结 不多bb&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; 案例一&#xff1a; import cv2 # 返回当前安装的 OpenCV 库的版本信息 并且是字符串格式 print(cv2.getVersionString()) """ 作用&#xff1a;它可以读取不同格式的图像文…

《DiffusionDet: Diffusion Model for Object Detection》ICCV2023

摘要 本文提出了一种新的框架DiffusionDet&#xff0c;它将目标检测任务表述为从带噪声的边界框到目标边界框的去噪扩散过程&#xff08;如图一所示&#xff09;。在训练阶段&#xff0c;目标边界框逐渐扩散到随机分布&#xff0c;模型学习逆转这一加噪过程。在推理阶段&#…

加深深度学习矩阵计算理解--用人类直觉 走进线性代数(非应试)

文章目录 前言一、向量二、线性组合、空间与基三、矩阵和线性变换四、矩阵乘法与线性变化复合1、矩阵乘法代表线性变换的复合2、实例说明 五、三维空间的线性变换1、基本性质2、直觉理解3、矩阵表示 六、行列式一、行列式的定义2、行列式在空间中的抽象理解 七、逆矩阵 列空间秩…

AIGC学习笔记(5)——AI大模型开发工程师

文章目录 AI大模型开发工程师004 垂直领域的智能在线搜索平台1 智能在线搜索平台需求分析大模型不够“聪明”增强大模型的方式需求分析2 智能在线搜索平台方案设计方案设计技术选型大模型版本GLM-4大模型注册使用Google Cloud平台注册创建可编程的搜索引擎3 智能在线搜索平台代…

【C++滑动窗口】1234. 替换子串得到平衡字符串|1877

本文涉及的基础知识点 C算法&#xff1a;滑动窗口及双指针总结 LeetCode1234. 替换子串得到平衡字符串 有一个只含有 ‘Q’, ‘W’, ‘E’, ‘R’ 四种字符&#xff0c;且长度为 n 的字符串。 假如在该字符串中&#xff0c;这四个字符都恰好出现 n/4 次&#xff0c;那么它就…

源码分享-Springboot+Vue大学生社团活动平台附源码,sql文件,配套论文

源码获取: 复制链接到浏览器打开即可领取 夸克网盘领取链接&#xff1a;https://pan.quark.cn/s/187d2ca0e3ec 百度网盘领取链接&#xff1a;https://pan.baidu.com/s/1apbO6k1cEqFXV-USf0I2IA?pwdccaj 提取码: ccaj 1.1课题背景及意义 随着现代网络技术发展&#xff0…

南山前海13元一份的猪脚饭

​今天没有带饭&#xff0c;中午打算去中国国有资本资本风投大厦的工地餐点吃个打工餐。 ​快到工地餐点就看到不少工友已经开始津津有味吃饭了哈。其实树下也有很多小鸟在觅食&#xff0c;可能是找一些剩饭吃的样子&#xff0c;大部分是麻雀为主。​ ​肚子有些饿&#xff0c;…

C++builder中的人工智能(29):如何在Windows项目中导入FANN库

这篇文章旨在使用由Steffen Nissen开发的FANN库实现人工神经网络。FANN库支持20多种编程语言&#xff0c;包括Delphi和C Builder。您可以在FANN的官方网站上找到完整信息和文档&#xff0c;并下载FANN的源文件。 步骤&#xff1a; 下载FANN库&#xff1a; 从Nissen的官方网站下…

Java开发人员学习ArkTs笔记(二)-函数与类

大家好&#xff0c;我是一名热爱Java开发的开发人员。目前&#xff0c;我正在学习ARKTS&#xff08;Advanced Java Knowledge and Technology Stack&#xff09;&#xff0c;并将不断输出我的学习笔记。我将在这里分享我学习ARKTS的过程和心得&#xff0c;希望能够为其他开发人…

maven环境搭建

maven基本知识 https://blog.csdn.net/qq_41187116/article/details/125955085?spm1001.2014.3001.5502 maven环境搭建 maven软件下载 不要去官网下&#xff0c;慢~ 直接相信清华大学吧&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.9.9/bin…