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,一经查实,立即删除!

相关文章

牛客练习赛55E树

牛客练习赛55E树 题意&#xff1a; 你有一颗大小为n 的树&#xff0c;点从 1 到 n 标号。 设dis(x,y)表示 x 到 y 的距离。 求∑i1n∑j1ndis2(i,j)\sum_{i1}^{n}\sum_{j1}^{n}dis^2(i,j)∑i1n​∑j1n​dis2(i,j)对998244353取模的结果 题解&#xff1a; 我们以1为根&#x…

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…

B Convex Polygon

B Convex Polygon 题意&#xff1a; 有n个点&#xff0c;每两个点组成一个坐标&#xff0c;现在问你是否所有的点可以构成一个凸多边形。并且这些点应该以顺时针方向输出。 题解&#xff1a; 很明显裸的凸包板子题&#xff0c;但是我们队里没人负责计算几何&#xff0c;当时…

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

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

CF1245D Shichikuji and Power Grid

CF1245D Shichikuji and Power Grid 题意&#xff1a; 已知一个平面上有 n 个城市&#xff0c;需要个 n 个城市均通上电 一个城市有电&#xff0c;必须在这个城市有发电站或者和一个有电的城市用电缆相连 在一个城市建造发电站的代价是 c[i] i 和 j两个城市相连的代价是 k[…

NetCore + SignalR 实现日志消息推送

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

CF1245F Daniel and Spring Cleaning(等会了更新)

CF1245F Daniel and Spring Cleaning 题意&#xff1a; 给定l&#xff0c;r&#xff0c;求∑alr∑blr[aba⊕b]\sum_{al}^{r}\sum_{bl}^{r}[aba⊕b]∑alr​∑blr​[aba⊕b] 题解&#xff1a; 对于这个式子&#xff0c;只有当a和b都不为0时成立&#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…

计算几何专题

选自计算几何专题 二维&#xff1a; 一。点&#xff0c;线&#xff0c;面&#xff0c;形基本关系&#xff0c;点积叉积的理解 POJ 2318 POJ 2398 POJ 1269 POJ 1556 POJ 2653 POJ 1066 POJ 1410 POJ 1696 POJ 3347 POJ 2826 POJ 1039 POJ 3449 POJ 1584 POJ 2074 二。凸包问…

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

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

Xor HDU - 6899

Xor HDU - 6899 题意&#xff1a; 给你A&#xff0c;B&#xff0c;K&#xff0c;W&#xff0c;问现在有多少个(x,y)满足下列形式&#xff1f; x,y都是整数x∈[0,A],y∈[0,B]|x-y|<kx xor y<W 题解&#xff1a; 数位dp 对于第1&#xff0c;2&#xff0c;4都是经典的数…

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

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

Sum of Log(2020上海C)

Sum of Log 题意&#xff1a; 求∑i0X∑j[i0]Y[i&j0]⌊log2(ij)1⌋\sum_{i0}^{X}\sum_{j[i0]}^{Y}[i\&j0]\lfloor log_{2}(ij)1\rfloor∑i0X​∑j[i0]Y​[i&j0]⌊log2​(ij)1⌋ 题解&#xff1a; 数位dp 如果式子想有意义&#xff0c;i&j就要等于0&#xf…

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&…