当前位置: 首页 > web >正文

AtCoder AT_abc404_g [ABC404G] Specified Range Sums

前言

赛时想到了差分约束,随手写了个 SPFA 结果挂的很惨……还是太菜了,赛后 Bellman-Ford 又调了半天。

题目大意

给定整数 N , M N,M N,M 和长度为 M M M 的三个整数序列 L = ( L 1 , L 2 , … , L M ) , R = ( R 1 , R 2 , … , R M ) , S = ( S 1 , S 2 , … , S M ) L=(L_1,L_2,\dots,L_M),R=(R_1,R_2,\dots,R_M),S=(S_1,S_2,\dots,S_M) L=(L1,L2,,LM),R=(R1,R2,,RM),S=(S1,S2,,SM)。请判断是否存在一个长度为 N N N正整数序列 A A A 满足 ∀ 1 ≤ i ≤ M , ∑ j = L i R i A j = S i \forall 1\le i\le M,\sum_{j=L_i}^{R_i}A_j=S_i ∀1iM,j=LiRiAj=Si。如果存在输出序列所有元素之和的最小值,否则输出 -1

思路

我们不妨令 s i s_i si 表示 ∑ j = 1 i A i \sum_{j=1}^i A_i j=1iAi,所以 ∀ 1 ≤ i ≤ M , s R i − s L i − 1 = S i \forall 1\le i\le M,s_{R_i}-s_{L_i-1}=S_i ∀1iM,sRisLi1=Si。很自然地想到差分约束(例题:洛谷 P1993 小 K 的农场),即利用最长路中如果 x x x y y y 连一条边权为 w w w 的边,那么满足 y ≥ x + w y\ge x+w yx+w 的性质解不等式。

关于差分约束的详细内容本文不再过多讲解,请自行搜索学习。

本题显然要跑最长路。我们来想一想,都需要连哪些边:

  • L i − 1 → R i L_i-1\to R_i Li1Ri,边权为 S i S_i Si
  • R i → L i − 1 R_i\to L_i-1 RiLi1,边权为 − S i -S_i Si
  • i − 1 → i i-1\to i i1i,边权为 1 1 1

所以,我们建了这样一张图,以 0 0 0 为源点跑 Bellman-Ford 最长路即可。(注:作者赛时使用 SPFA 挂的很惨,如果您知道为什么这道题只能使用 Bellman-Ford 或者 SPFA 需要注意什么,可以在评论区中回复!)

那么答案就是 s n s_n sn,即 0 0 0 n n n 的最长路。

现在分析无解情况:

  • 该图中存在负环情况。
  • S i < R i − L i + 1 S_i<R_i-L_i+1 Si<RiLi+1 的时候也不满足条件。
  • s n s_n sn 为负无穷。

代码

提交记录:这里。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;int n, m;
long long dis[5010];
int vis[5010];
int sum[5010];struct edge
{int x, y, w;
} ;vector<edge> e;void add(int x, int y, int w)
{e.push_back((edge){x, y, w});
}bool bellman_ford(int s)
{memset(dis, -0x3f, sizeof(dis));dis[s] = 0;for (int i = 0; i <= n; i++){bool flag = false;for (int j = 0; j < e.size(); j++){int x = e[j].x;int y = e[j].y;int w = e[j].w;if (dis[x] >= -1e17 && dis[y] < dis[x] + w){dis[y] = dis[x] + w;flag = true;}}if (!flag) return false;}return true;
}int main()
{cin >> n >> m;for (int i = 1; i <= m; i++){int u, v, w;cin >> u >> v >> w;if (w < v - u + 1){cout << "-1" << endl;return 0;}int t = w - (v - u + 1);add(v, u - 1, -w);add(u - 1, v, w);
//		cout << u - 1 << " " << v << endl;}for (int i = 1; i <= n; i++)add(i - 1, i, 1);if (bellman_ford(0) || dis[n] <= -1e17)cout << "-1" << endl;else{
//		for (int i = 0; i <= n; i++)
//			cout << dis[i] << " ";
//		cout << endl; long long minn = 0;for (int i = 1; i <= n; i++)minn = min(minn, dis[i]);cout << dis[n] << endl;}return 0;
}

总结

这次的 G 很水,难度顶多 普及 + / 提高 \color{green}普及+/提高 普及+/提高,思维难度和代码实现难度都

求助

作者赛时使用 SPFA 挂的很惨,如果您知道为什么这道题只能使用 Bellman-Ford 或者 SPFA 需要注意什么,可以在评论区中回复!

http://www.xdnf.cn/news/3661.html

相关文章:

  • ​​信息泄露:网站敏感文件泄漏的隐形危机与防御之道​
  • 前端面试每日三题 - Day 23
  • 泰迪杯特等奖案例学习资料:基于时空图卷积网络的城市排水系统水位精准重建与异常检测
  • Power Query精通指南2:数据转换——透视/逆透视/分组、横向纵向合并数据、条件判断、处理日期时间
  • 如何设计抗Crosstalk能力强的PCB镀穿孔
  • Linux 进程间通信(IPC)详解
  • 【计算机视觉】目标检测:yoloV1~yoloV11项目论文及对比
  • 【信息系统项目管理师-论文真题】2011上半年论文详解(包括解题思路和写作要点)
  • LVGL -文本显示 英文、中文
  • MaC QT 槽函数和Lambda表达式
  • Leetcode刷题记录29——矩阵置零
  • 【JavaScript】性能优化:打造高效前端应用
  • 数据赋能(212)——质量管理——统一性原则
  • ROS2学习笔记|实现订阅消息并朗读的详细步骤
  • Easy云盘总结篇-登录注册
  • C# 编程核心:控制流与方法调用详解
  • 力扣每日一题 ​838. 推多米诺​
  • PyCharm中全局搜索无效
  • 软件测试名词科普:驱动模块、桩模块
  • springAop代理责任链模式源码解析
  • Socket-TCP
  • 【信息系统项目管理师】【2017年-2024年】计算画图题汇总——案例分析
  • [更新完毕]2025东三省B题深圳杯B题数学建模挑战赛数模思路代码文章教学:LED显示屏颜色转换设计与校正
  • ES6入门---第二单元 模块三:对象新增、
  • 深入理解 HttpExchange_Java 中构建 HTTP 服务的基础组件
  • 0基础 | STM32 | TB6612电机驱动使用
  • 2025年- H22-Lc130-206. 反转链表(链表)---java版
  • FreeRtos实战从入门到精通--任务创建和删除(动态方法)--事了拂衣去,深藏功与名
  • scikit-learn在监督学习算法的应用
  • linux下,ollama会把模型文件保存在哪里?