CF1253F Cheap Robot

CF1253F Cheap Robot

题意:

给你一张 N 个点的带权无向连通图,其中结点 1,2,…,k 为充电中心。

一个机器人在图中行走,假设机器人的电池容量为 c,则任何时刻,机器人的电量 x 都必须满足 c0≤x≤c。如果机器人沿着一条边权为 w 的边从结点 i 走到结点 j,它的电量会减少 w。机器人可以在到达某个充电中心时把电量充满。

现在有 q 个询问,每次询问机器人要从 a 点到达 b 点,电池容量至少为多少,各个询问相互独立。保证 a 点和 b 点都是充电中心。

题解:

我和队友讨论这个题,讨论的大差不差,但是有个错误。我们一开始认为点a到点b的距离,直接跑最小生成树就可以,但其实并不是,我们忽略了充电中心的作用,比如从3到1,路线为3→9→8→7→2→7→6→5→4→1,到7时并没有直接前往6,而是先到2充满电,然后在去6,这样相当于及时充电。
也就是我们可以通过走向最近的充电中心来补充能量,这样可以优化电池容量,所以我们需要求出任意一个点到离他最近的充电站的距离
这怎么求?多源最短路,没必要,我们可以建一个超级源点,连向所有充电站,边权为0,然后再新图上跑一个最短路,求出所有点到离他最近的充电站的距离
现在得到dis[i]:表示距离点i最近的充电站的距离
怎么用呢?如下
对于一个可以完成的路径(不会在半路因为能量不足而无法完成)
我们设当前走到点i,剩余电量为x,一定会有x>=disix>=dis_{i}x>=disi(题目保证终点是充电站,且中途可以充电,如果x<dis_{i}就无法走到终点了)
设电容量为c,有c>=x>=disic>=x>=dis_{i}c>=x>=disi,c相当于上界
因为走到i点至少要消耗disidis_{i}disi的电(因为距离i最近的充电站才dis_{i},不可能总消耗比dis_{i}还小),所以有:c−disi>=x>=disic-dis_{i}>=x>=dis_{i}cdisi>=x>=disi

设下一个点是j,且边权为wijwijwij,有:c−disj>=x−wi,j>=disjc-dis_{j}>=x-w_{i,j}>=dis_{j}cdisj>=xwi,j>=disj,道理同上(注意这个式子里的下标是j)
现在我们合并两个式子,就可以得到关于点i到点j的路径信息
有:x−wi,j>=disjx-w_{i,j}>=dis_{j}xwi,j>=disj,我们用c来代替x,因为我们想要的是与c相关的式子,得到:
disj<=c−disi−wi,jdis_{j}<=c-dis_{i}-w_{i,j}disj<=cdisiwi,j
整理:
c>=disi+disj+wi,jc>=dis_{i}+dis_{j}+w_{i,j}c>=disi+disj+wi,j
这个式子的含义不就是从点i到点j所需要的最小电池容量为disi+disj+wi,jdis_{i}+dis_{j}+w_{i,j}disi+disj+wi,j,也就是我们求出了原图中任意两个相邻点所需要的电池容量。
上述推到过程建议仔细阅读,慢慢体会,很妙
现在每次询问一个起点 a 到 b 的最小电池容量,就是找一条从 a 点到 b 点的路径,使得这个路径上的最大值最小
这个路径一定是在最小生成树上的,这是最小生成树经常解决的问题。因为最小生成树加边是从小到大,且保证图联通的情况下
我们构造最小生成树,然后问题就变成求a到b路径上的最大值,可以用LCA+倍增来求
在这里插入图片描述
这是一个综合性很强且考察代码能力的题,值得一刷

代码:

// Problem: F. Cheap Robot
// Contest: Codeforces - Codeforces Round #600 (Div. 2)
// URL: https://codeforces.com/contest/1253/problem/F
// Memory Limit: 512 MB
// Time Limit: 3000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC target("avx")
//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
//#pragma GCC optimize("Ofast")
// created by myq
#include <algorithm>
#include <cctype>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;
typedef long long ll;
#define x first
#define y second
typedef pair<ll,ll> pii;
const int N= 400010;
const int mod= 998244353;
inline int read()
{int res= 0;int f= 1;char c= getchar();while (c > '9' || c < '0') {if (c == '-')f= -1;c= getchar();}while (c >= '0' && c <= '9') {res= (res << 3) + (res << 1) + c - '0';c= getchar();}return res;
}
struct node
{int a;int b;ll c;bool operator<(const node& w) const{return c < w.c;}
} q[N];
int p[N];
vector<pii> v[N];
int idx;
int n, m, k, _;
int newcnt;
int val[N];
ll dist[N];
vector<pii> g[N];
vector<pair<int, ll>> ng[N];
int dep[N];
int f[N][20];
bool st[N];
ll f2[N][20];
int find(int x)
{if (p[x] != x)p[x]= find(p[x]);return p[x];
}
// void dfs(int u,int fa,int top,ll sum=0){
// for(auto j:v[u]){
// if(j.x==fa)	continue;
// if(j.x>k)
// dfs(j.x,u,top,sum+j.y);
// else
// {
// g[top].push_back({j.x,j.y});
// dfs(j.x,u,j.x,0);
// }
// }
// }
void dfs2(int u, int fa, ll faw)
{dep[u]= dep[fa] + 1;f[u][0]= fa;f2[u][0]= faw;for (auto j : ng[u]) {if (j.x == fa)continue;dfs2(j.x, u, j.y);}
}
ll maxlca(int a, int b)
{ll maxv= 0;if (dep[a] < dep[b])swap(a, b);for (int i= 19; i >= 0; i--)if (dep[f[a][i]] >= dep[b]) {maxv= max(maxv, f2[a][i]);a= f[a][i];}if (a == b)return maxv;for (int i= 19; i >= 0; i--)if (f[a][i] != f[b][i]) {maxv= max(maxv, f2[a][i]);maxv= max(maxv, f2[b][i]);a= f[a][i], b= f[b][i];}maxv= max(maxv, max(f2[a][0], f2[b][0]));return maxv;
}
void dijkstra()
{priority_queue<pii, vector<pii>, greater<pii>> q;for (int i= 0; i <= n; i++)dist[i]= 1e18;dist[0]= 0;q.push({0, 0});while (q.size()) {auto tt= q.top();q.pop();if (st[tt.y])continue;st[tt.y]= 1;for (auto j : g[tt.y]) {if (dist[j.x] > dist[tt.y] + j.y) {dist[j.x]= dist[tt.y] + j.y;if (!st[j.x])q.push({dist[j.x], j.x});}}}
}
void init()
{for (int i= 1; i <= 19; i++)for (int u= 1; u <= n; u++) {f[u][i]= f[f[u][i - 1]][i - 1], f2[u][i]= max(f2[u][i - 1], f2[f[u][i - 1]][i - 1]);}
}
int main()
{// ios::sync_with_stdio(0);// cin.tie(0);// cout.tie(0);cin >> n >> m >> k >> _;newcnt= k;for (int i= 0; i < m; i++) {int a, b, c;scanf("%d%d%d", &a, &b, &c);q[i]= {a, b, c};}for (int i= 1; i <= n; i++)p[i]= i;int A, B;for (int i= 0; i < m; i++) {int a, b;a= q[i].a;b= q[i].b;g[a].push_back({b, q[i].c});g[b].push_back({a, q[i].c});}for (int i= 1; i <= k; i++)g[0].push_back({i, 0});dijkstra();for (int i= 0; i < m; i++) {q[i].c= dist[q[i].a] + dist[q[i].b] + q[i].c;}sort(q, q + m);int cnt= 0;for (int i= 0; i < m; i++) {ll c= q[i].c;int a= q[i].a;int b= q[i].b;a= find(a);b= find(b);if (a != b) {p[a]= b;//            cout << q[i].a << " " << q[i].b << " " << c << endl;ng[q[i].a].push_back({q[i].b, c});ng[q[i].b].push_back({q[i].a, c});cnt++;if (cnt == n - 1)break;}}//	dfs(1,0,1,0);dfs2(1, 0, 0);init();while (_--) {int a, b;scanf("%d%d", &a, &b);cout << maxlca(a, b) << endl;}return 0;
}
/**
* In every life we have some trouble
* When you worry you make it double
* Don't worry,be happy.
**/

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

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

相关文章

asp.net core 3.0 gRPC框架小试

什么是gRPCgRPC是google开源的一个高性能、跨语言的RPC框架&#xff0c;基于HTTP2协议&#xff0c;采用ProtoBuf 定义的IDL。gRPC 的主要优点是&#xff1a;现代高性能轻量级 RPC 框架。协定优先 API 开发&#xff0c;默认使用协议缓冲区&#xff0c;允许与语言无关的实现。可用…

P1131 [ZJOI2007] 时态同步

P1131 [ZJOI2007] 时态同步 题意&#xff1a; 有一颗树&#xff0c;有一个点是激发器&#xff0c;从这个点开始可以产生一个激励电流&#xff0c;通过导线传向每一个它所连接的节点&#xff0c;经过一个边的花费为w[i],你有一个道具&#xff0c;每用一次可以让一个边的花费1&…

.Net开发者必知的技术类RSS订阅指南

作为一个.Net开发者&#xff0c;在如今这个信息大爆炸时代&#xff0c;网络上.net开发方面的信息浩如烟海(获取信息的渠道很多&#xff0c;比如各种 APP、公众号、聚合信息网站、博客园、InfoQ等等)&#xff0c;如何用有限的时间来获取并消化有效信息显得格外重要。虽然我们获取…

又一最大子段和

又一最大子段和&#xff08;牛客小白月赛38 &#xff09; 题意&#xff1a; 我们将一个数列{an}的最大字段和的值记为S(a),现在你可以对进行若干次操作&#xff0c;每次操作&#xff0c;你可以选择数列中的一个数字&#xff0c;将其改为[−10100,10100][-10^{100},10^{100}][…

我的微服务观,surging 2.0将会带来多大的改变

Surging 自2017年6月16日开源以来&#xff0c;已收到不少公司的关注或者使用&#xff0c;其中既有以海克斯康超大型等外企的关注&#xff0c;也不乏深圳泓达康、重庆金翅膀等传统行业的正式使用&#xff0c;自2019年年初&#xff0c;surging2.0 便已正式进入研发阶段&#xff0…

corefx 源码学习:SqlClient 是如何同步建立 Socket 连接的

在昨天的技术周会上发现 EnyimMemcached 中建立 Socket 连接的代码有问题&#xff0c;今天坐车的时候在手机上阅读 .net core 2.2 的 SqlClient 中同步建立 Socket 连接的代码 SNITcpHandle.cs#L180 学习了一下。建立 Socket 连接需要处理2个问题&#xff1a;1&#xff09;处理…

NetCore + SignalR 实现日志消息推送

哈喽大家周一好呀&#xff0c;感觉好久没有写文章了&#xff0c;上周出差了一次&#xff0c;感觉还是比坐办公室好的多&#xff0c;平时在读一本书《时生》&#xff0c;感兴趣的可以看看?......这几天翻看 NetCore 相关知识扩展的时候&#xff0c;发现了久违的一个知识点 ——…

使用Entity Framework Core访问数据库(DB2篇)

上一篇讲了一些EF Core访问Oracle的坑。&#xff08;感兴趣请移步&#xff1a;使用Entity Framework Core访问数据库&#xff08;Oracle篇&#xff09;&#xff09;这篇主要讲一下关于EF Core访问DB2的一揽子~问题。本篇采用DBFirst直接生成实体。关于EF Core DB2 的官方文档&a…

Linux中以单容器部署Nginx+ASP.NET Core

正如前文提到的&#xff0c;强烈推荐在生产环境中使用反向代理服务器转发请求到Kestrel Http服务器&#xff0c;本文将会实践将Nginx --->ASP.NET Core 部署架构容器化的过程。Nginx->ASP.NET Coe部署架构容器化在Docker中部署Nginx--->ASP.NETCore 有两种选择&#x…

领域驱动设计学习之路—DDD的原则与实践

本文是我学习Scott Millett & Nick Tune编著的《领域驱动设计模式、原理与实践》一书的学习笔记&#xff0c;一共会分为4个部分如下&#xff0c;此文为第1部分&#xff1a;领域驱动设计的原则与实践战略模式&#xff1a;在有界上下文之间通信战术模式&#xff1a;创建有效的…

.NET Core中使用Dapper操作Oracle存储过程最佳实践

为什么说是最佳实践呢&#xff1f;因为在实际开发中踩坑了&#xff0c;而且发现网上大多数文章给出的解决方法都不能很好地解决问题。尤其是在获取类型为OracleDbType.RefCursor&#xff0c;输出为&#xff1a;ParameterDirection.Output数据的时候。网上千篇一律的说写一个Ora…

CanalSharp.AspNetCore v0.0.4-支持输出到MongoDB

一、多样输出支持CanalSharp.AspNetCore是一个基于CanalSharp的适用于ASP.NET Core的一个后台任务组件&#xff0c;它可以随着ASP.NET Core实例的启动而启动&#xff0c;目前采用轮询的方式对Canal Server进行监听&#xff0c;获得MySql行更改&#xff08;RowChange&#xff09…

CF1039C Network Safety

CF1039C Network Safety 题意&#xff1a; 题解&#xff1a; 如果我们同时选中a&#xff0c;b两个点&#xff0c;无论异或什么值&#xff0c;都不会影响图的安全性&#xff0c;因为图本来就是安全的 破坏图的安全性只有一种情况&#xff0c;那就是选了a&#xff0c;没选b&…

使用Jenkins来实现内部的持续集成流程(下)

目录配置项目构建添加任务添加源代码地址和登录凭据添加构建触发器 TFS添加WebHook 添加构建步骤后端UI API端 配置项目构建1添加任务2添加源代码地址和登录凭据添加源代码地址和登录凭证此图没有填写凭证时显示的错误点击Credential后面的添加 填写能访问源代码的用户名和密码…

.NET和Docker ,比翼双飞

DockerCon 2019本周将在旧金山举行 &#xff0c;DockerCon 是从业者、贡献者、维护者、开发者和容器生态系统学习、网络和创新的一站式活动。 .NET 团队博客发布了《一起使用.NET和Docker - DockerCon 2019更新》&#xff1a;https://devblogs.microsoft.com/dotnet/using-net-…

Visible Lattice Points SPOJ - VLATTICE

Visible Lattice Points SPOJ - VLATTICE 题意&#xff1a; 有一个n∗n∗n的三维直角坐标空间&#xff0c;问从(0,0,0)看能看到几个点。 题解&#xff1a; 本题是二维的一个升级版&#xff0c;升级成三维 用莫比乌斯反演来做 代码&#xff1a; #include <bits/stdc.h…

使用ASP.NET Core开发GraphQL服务器 -- 极简预备知识(上)

为了介绍使用ASP.NET Core构建GraphQL服务器&#xff0c;本文需要介绍一下GraphQL&#xff0c;其实看官网的文档就行。什么是GraphQL&#xff1f;GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。 GraphQL 对你的 API 中的数据提供了一套易于理解的完整描…

使用 dotnet 命令行配合 vscode 完成一个完整 .NET 解决方案的编写和调试

如果你是开发个人项目&#xff0c;那就直接用 Visual Studio Community 版本吧&#xff0c;对个人免费&#xff0c;对小团体免费&#xff0c;不需要这么折腾。如果你是 Mac / Linux 用户&#xff0c;不想用 Visual Studio for Mac 版&#xff1b;或者不想用 Visual Studio for …

亲儿子 | Azure SignalR 服务现在支持 ASP.NET

点击上方蓝字关注“汪宇杰博客”文 / Zhidi译 / Edi Wang我们刚刚发布了支持ASP.NET的正式版 SignalR 服务 SDKMicrosoft.Azure.SignalR.AspNet v1.0.0Azure SignalR 服务是一种完全托管的用于实时消息传递的 Azure 服务。它是扩展 ASP.NET Core SignalR 应用程序的首选方法。但…

VS Code Remote 发布!开启远程开发新时代

今天&#xff08; 北京时间 2019 年 5 月 3 日 &#xff09;&#xff0c;在 PyCon 2019 大会上&#xff0c;微软发布了 VS Code Remote&#xff0c;开启了远程开发的新时代&#xff01;这次发布包含了三款核心的全新插件&#xff0c;它们可以帮助开发者在容器&#xff0c;物理或…