【ICPC】The 2021 ICPC Asia Shanghai Regional Programming Contest H

Life is a Game

#最小生成树 #重构树 #图论 #贪心

题目描述

A good problem should have a concise statement.
You are given an array a a a of length n n n, initially filled with zeros, and another array b b b of length n n n. Your goal
is to transform array a a a into array b b b. You can perform the following two types of operations:
1 x : 1 \ x: 1 x: Add 1 1 1 to all elements in a that are equal to x . x. x.
2 x : 2 \ x: 2 x: Add 1 1 1 to the element in a at index x . x. x.
You can perform no more than 20000 20 000 20000 operations.

输入格式

The first line contains three integers n , m , q ( 1 ≤ n , m , q ≤ 1 0 5 ) n,m,q\,(1\le n,m,q \le 10^5) n,m,q(1n,m,q105), denoting the number of cities, roads and game saves respectively.

The second line contains n n n integers a 1 , a 2 , ⋯ , a n ( 1 ≤ a i ≤ 1 0 4 ) a_1, a_2, \cdots, a_n\,(1\le a_i \le 10^4) a1,a2,,an(1ai104), denoting the bonus social ability points for the cities.

Following m m m lines each contains three integers u , v , w , ( 1 ≤ u ≤ v ≤ n , 1 ≤ w ≤ 1 0 9 ) u, v, w\ ,(1 \leq u \leq v \leq n, 1\leq w \leq 10^9) u,v,w ,(1uvn,1w109), denoting that cities u , v u,v u,v are undirectedly connected by a road of ability threshold w w w.

Following q q q lines each contains two integers x , k ( 1 ≤ x ≤ n , 1 ≤ k ≤ 1 0 9 ) x, k\,(1\le x \le n, 1\le k \le 10^9) x,k(1xn,1k109), denoting the game saves.

输出格式

Input

The first line contains three integers n , m , q ( 1 ≤ n , m , q ≤ 1 0 5 ) n,m,q\,(1\le n,m,q \le 10^5) n,m,q(1n,m,q105), denoting the number of cities, roads and game saves respectively.

The second line contains n n n integers a 1 , a 2 , ⋯ , a n ( 1 ≤ a i ≤ 1 0 4 ) a_1, a_2, \cdots, a_n\,(1\le a_i \le 10^4) a1,a2,,an(1ai104), denoting the bonus social ability points for the cities.

Following m m m lines each contains three integers u , v , w , ( ≤ u ≤ v ≤ n , 1 ≤ w ≤ 1 0 9 ) u, v, w\ ,(\leq u \leq v \leq n, 1\leq w \leq 10^9) u,v,w ,(uvn,1w109), denoting that cities u , v u,v u,v are undirectedly connected by a road of ability threshold w w w.

Following q q q lines each contains two integers x , k ( 1 ≤ x ≤ n , 1 ≤ k ≤ 1 0 9 ) x, k\,(1\le x \le n, 1\le k \le 10^9) x,k(1xn,1k109), denoting the game saves.

样例 #1

样例输入 #1

8 10 2
3 1 4 1 5 9 2 6
1 2 7
1 3 11
2 3 13
3 4 1
3 6 31415926
4 5 27182818
5 6 1
5 7 23333
5 8 55555
7 8 37
1 7
8 30

样例输出 #1

16
36

解法

首先,从一个点出发到达另一个点,如果两点之间有多条路径,那么我们一定走最长边最短的那一条路径,这样我们才有更高的可能到达这个点。

因此,容易发现,使得图联通的情况下,最优的情况就是最小生成树了。

现在的问题转换为,如何从最小生成树的任意一个点判断最多能获得多少贡献。

因为我们的边是双向边,并且我们能够走回头路,因此我们最优的情况一定是先把边权小的边走了,获得了相应点的点权之后,回过头来继续走边权大的点。

确定了策略,如何优化查询呢?

回顾 k r u s k a l kruskal kruskal重构树,我们知道原图中任意两点之间的最长边可以被转换为重构树上非叶子节点的点权,如下图:

在这里插入图片描述

那么我们可以利用倍增的思想,预处理出叶子节点向这条链跳的最大的边权和获得点权之间的关系,即边权-点权最大值,往根节点的这一段是递增的。

每次我们初始获得的价值,都可以倍增的向上跳,价值不够继续跳了,那么答案就是这个点以下的所有的叶子节点的权重,因为在重构树上叶子节点的权重为原图中的点权。

这样整体复杂度在 O ( m l o g 2 m + q l o g 2 n ) O(mlog_2m + qlog_2n) O(mlog2m+qlog2n)

代码

const int N = 2e5 + 10;
int n, m, q,tot;
int a[N],w[N],p[N];
struct node {int u, v, dis;bool operator<(const node& x)const {return dis < x.dis;}}edge[N];int find(int x) {return p[x] = p[x] == x ? x : find(p[x]);
}vector<int>e[N];void kruskal() {sort(edge + 1, edge + 1 + m);for (int i = 1; i <= 2 * n + 1; ++i) {p[i] = i;}for (int i = 1; i <= m; ++i) {int u = edge[i].u, v = edge[i].v, dis = edge[i].dis;int pu = find(u), pv = find(v);if (pu != pv) {p[pv] = p[pu] = ++tot;e[tot].push_back(pu); e[tot].push_back(pv);w[tot] = dis;}}}int fa[N][21];
int d[N];
void dfs(int u) {for (auto& v : e[u]) {fa[v][0] = u;for (int i = 1; i <= 20; ++i) {fa[v][i] = fa[fa[v][i - 1]][i - 1];}dfs(v);a[u] += a[v];}d[u] = w[fa[u][0]] - a[u];
}int c[N][21];void dfs2(int u) {for (auto& v : e[u]) {c[v][0] = d[v];for (int i = 1; i <= 20; ++i) {c[v][i] = std::max(c[v][i - 1], c[fa[v][i - 1]][i - 1]);}dfs2(v);}}
void solve() {cin >> n >> m >> q;tot = n;for (int i = 1; i <= n; ++i) {cin >> a[i];}for (int i = 1; i <= m; ++i) {int u, v, dis;cin >> u >> v >> dis;edge[i] = { u,v,dis };}kruskal();dfs(tot);dfs2(tot);a[0] = a[tot];while (q--) {int x, k;cin >> x >> k;for (int i = 20; i >= 0; --i) {if (c[x][i] <= k) {x = fa[x][i];}}std::cout << a[x] + k << "\n";}
}
signed main() {ios::sync_with_stdio(0);std::cin.tie(0);std::cout.tie(0);int t = 1;//cin >> t;while (t--) {solve();}
};

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

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

相关文章

Pandas处理时间序列之光谱分析与聚类

import matplotlib.pylab as plt %matplotlib inline import numpy as np from numpy import fft import pandas as pd 一、光谱分析 • 将时间序列分解为许多正弦或余弦函数的总和 • 这些函数的系数应该具有不相关的值 • 对正弦函数进行回归 光谱分析应用场景 基于光谱的…

集师知识付费小程序:打造培训机构在线教育的金字招牌 集师知识付费系统 集师知识付费小程序 集师知识服务系统 集师线上培训系统 集师线上卖课小程序

在数字化浪潮的推动下&#xff0c;在线教育已成为教育领域的热门话题。而在众多在线教育平台中&#xff0c;集师知识付费小程序凭借其独特的定位和创新的模式&#xff0c;成功为培训机构打造了一张闪亮的在线教育金字招牌。 集师知识付费小程序&#xff0c;是一个集课程展示、…

哪款宠物空气净化器性价比高?希喂、米家和范罗士哪款更好?

这次我真的不是很想抱怨&#xff0c;是我男朋友真的很过分&#xff01;真的很过分&#xff0c;差点让我们两个分道扬镳。先听我说&#xff0c;这不是我和他都嫌家里太安静了吗&#xff0c;每天下班后两个人吃完饭就各玩各的手机&#xff0c;生活太无趣了&#xff0c;加上这几年…

软件功能测试重点和流程有哪些?专业软件测评服务公司推荐

软件功能测试就是对产品的各功能进行验证&#xff0c;根据功能测试用例&#xff0c;逐项测试&#xff0c;检查产品是否达到用户要求的功能。功能测试也叫黑盒测试或数据驱动测试&#xff0c;只需考虑需要测试的各个功能&#xff0c;不需要考虑整个软件的内部结构及代码.一般从软…

windows 安装 ElasticSearch

1、下载安装包 下载地址&#xff1a;https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.14.3-windows-x86_64.zip ElasticSearch 目录结构如下&#xff1a; 2、配置JDK环境 ES比较耗内存&#xff0c;建议虚拟机4G或以上内存&#xff0c;jvm1g以上的内存分…

告别信息过载!NotebookLM:你的AI学习与研究助手

在信息爆炸的时代&#xff0c;我们每天都面临着海量的信息&#xff0c;如何高效地处理和理解这些信息&#xff0c;成为了许多人面临的挑战。 Google 推出的 NotebookLM&#xff0c;或许能成为你的答案。这款结合了大语言模型 (LLM) 与用户笔记的 AI 笔记本&#xff0c;正在重新…

【网络安全】一篇文章带你了解CTF那些事儿

文章目录 一、什么是CTF&#xff1f;二、CTF需要学习那些知识&#xff1f;新书推荐适合新手自学的网络安全基础技能“蓝宝书”&#xff1a;《CTF那些事儿》内容简介读者对象专家推荐三、网络安全学习路线四、网络安全学习资料 一、什么是CTF&#xff1f; CTF&#xff08;Captu…

vue+element的confirm提示消息文字变色和换行

效果: 思路: 可以考虑采用模板字符串的思路实现 代码: this.confirm(您确定要<b style"Color: red">${text}</b>的数据项&#xff1f;<br/>单位名称: ${row.companyName} <br/>属性: ${row.attributeName}).then(() > {console.log(确定…

深入理解Java并发读写锁——ReentrantReadWriteLock

ReentrantReadWriteLock使用场景 ReentrantReadWriteLock 是 Java 的一种读写锁&#xff0c;它允许多个读线程同时访问&#xff0c;但只允许一个写线程访问&#xff08;会阻塞所有的读写线程&#xff09;。这种锁的设计可以提高性能&#xff0c;特别是在读操作的数量远远超过写…

预算不变,数据安全大升级!揭秘TRAID+的神奇之处

假期过后&#xff0c;公司弥漫着一股低沉的气息&#xff0c;公司的CTO&#xff0c;小威&#xff0c;正面对着一个令人头疼的问题——如何在不增加预算的情况下&#xff0c;提高公司的数据安全性。 如今各种勒索病毒层出不穷&#xff0c;或是因为硬盘的损坏或者员工的马虎使数据…

通信工程学习:什么是UART通用异步收发器

UART&#xff1a;通用异步收发器 UART&#xff0c;全称Universal Asynchronous Receiver/Transmitter&#xff0c;即通用异步收发传输器&#xff0c;是一种广泛应用于嵌入式领域的串行、异步、全双工通信协议。以下是关于UART的详细介绍&#xff1a; 一、定义与特点 定义&…

Docker安装ActiveMQ镜像以及通过Java生产消费activemq示例

拉取镜像 docker pull docker.io/webcenter/activemq 启动容器 docker run -d --name myactivemq -p 61616:61616 -p 8162:8161 docker.io/webcenter/activemq:latest 这样就代表启动成功了 浏览器访问 http://localhost:8162/ admin admin 开启验证 修改配置文件/opt/ac…

【工具推荐】Hikvision - 一款海康威视综合漏洞利用工具,适用于漏洞挖掘、SRC漏洞挖掘、护网红队、渗透测试,支持一键获取 shell。

0x00 工具介绍 Hikvision 是一款海康威视综合漏洞利用工具。 0x01 下载链接 Hikvision 下载链接: Hikvision下载 0x02 功能介绍 Hikvision 摄像头未授权访问漏洞Hikvision 远程代码执行漏洞Hikvision iVMS 综合安防系统任意文件上传漏洞Hikvision 综合安防管理平台 isecur…

三款GIS工具多角度对比:免费的倾斜摄影OSGB/3Dtiles编辑转换发布平台

GIS数据处理工具在现代技术与应用中扮演着至关重要的角色&#xff0c;它们不仅是连接原始地理信息与可分析、可视化数据的桥梁&#xff0c;更是推动地理信息系统&#xff08;GIS&#xff09;在各个行业领域深入发展与应用不可或缺的关键工具。选择一款合适的工具直接关系到数据…

CentOS 7 安装并部署 Mysql

安装 Mysql 下载并添加库&#xff08;自动安装&#xff09; sudo yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm安装 Mysql 包&#xff08;一路键入y即可&#xff09; yum -y install mysql mysql-server --nogpgcheck- -nogpgc…

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz(多数据源配置)

SpringBoot教程&#xff08;二十四&#xff09; | SpringBoot实现分布式定时任务之Quartz&#xff08;多数据源配置&#xff09; 前言多数据源配置引入aop依赖1. properties配置多数据源2. 创建数据源枚举类3. 线程参数配置类4. 数据源动态切换类5. 多数据源配置类HikariCP 版本…

如何用好 CloudFlare 的速率限制防御攻击

最近也不知道咋回事儿,群里好多站长都反映被CC 攻击了。有人说依旧是 PCDN 干的,但明月感觉不像,因为有几个站长被 CC 攻击都是各种动态请求(这里的动态请求指的是.php 文件的请求)。经常被攻击的站长们都知道,WordPress /Typecho 这类动态博客系统最怕的就是这种动态请求…

删除 Word 空白页的 3 种方法总结

在使用 Word 进行文档编辑的时候&#xff0c;空白页的出现常常会让用户感到困扰&#xff0c;Word 空白页的出现可能是由于分页、段落设置以及格式问题&#xff0c;空白页可能会出现在文档的开始、中间及结尾&#xff0c;如果需要打印文档还会影响打印效果&#xff0c;那么 Word…

Visual Studio--VS安装配置使用教程

Visual Studio Visual Studio 是一款功能强大的开发人员工具&#xff0c;可用于在一个位置完成整个开发周期。 它是一种全面的集成开发环境 (IDE)。对新手特别友好&#xff0c;使用方便&#xff0c;不需要复杂的去配置环境。用它学习很方便。 Studio安装教程 Visual Studio官…

基于Data+AI构建真正的流批一体!

基于DataAI构建真正的流批一体&#xff01; 前言流批一体的前世今生如何构建真正的流批一体架构数据架构统一数据处理引擎的选择数据治理与数据质量 流批一体的实践案例结语 前言 你是不是也有过这种感觉&#xff1f; 当你坐在电脑前&#xff0c;面对海量数据&#xff0c;心里…