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

ABC404G 题解

G. Specified Range Sums

题意

有三个长度为 M M M 的序列 L , R , S L,R,S L,R,S,你要判断是否存在一个长度为 N N N正整数 序列 A A A,满足以 ∑ j = L i R i A j = S i \sum_{j=L_i}^{R_i} A_j=S_i j=LiRiAj=Si

若存在,找到最小的 ∑ j = 1 N A j \sum_{j=1}^N A_j j=1NAj;否则,输出 -1

思路

首先,我们考虑将求和转换为前缀和,即定义 C i = ∑ j = 1 i A j C_i=\sum_{j=1}^iA_j Ci=j=1iAj,则 C R i − C L i − 1 = S i C_{R_i}-C_{L_i-1}=S_i CRiCLi1=Si

建立有向图,顶点编号为 0 ∼ n 0 \sim n 0n,这样连边: ( L i − 1 , R i ) = S i (L_i-1,R_i)=S_i (Li1,Ri)=Si ( R i , L i − 1 ) = − S i (R_i,L_i-1)=-S_i (Ri,Li1)=Si。另外,由于是正整数序列,所以 ( i + 1 , i ) = − 1 (i+1,i)=-1 (i+1,i)=1

我们需要计算 n → 0 n \rightarrow 0 n0 的最短路,答案即为这个值的相反数。

注意:无解时图中有负环,所以 Dijkstra \text{Dijkstra} Dijkstra 不可以。考虑可以处理负环的 Bellman-Ford \text{Bellman-Ford} Bellman-Ford 算法(不会没关系,下面讲):

与图上动态规划相似,定义 d i s i dis_i disi 表示 从 n n n i i i 的最短路, d i s n = 0 dis_n=0 disn=0,其余为 ∞ \infty

共进行 N N N 次操作,每次操作如下:

  • 对于每一条有向边 ( u , v ) = w (u,v)=w (u,v)=w d i s v = min ⁡ ( d i s v , d i s u + w ) dis_v=\min(dis_v,dis_u+w) disv=min(disv,disu+w),共 M M M 条边。

复杂度为 O ( N M ) O(NM) O(NM),通常把上述操作称作 松弛(relax)

在这 N N N 次松弛之后,再执行第 N + 1 N+1 N+1 次操作,若还可以继续执行松弛操作,就说明图中存在负环,无解,输出 − 1 -1 1

最终答案即为 − d i s 0 -dis_0 dis0

C++ 代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf=3e18;
const int maxn=4005;
int n,m;
struct Node{int u,v,w;
};
vector<Node> v;
int dis[maxn];
signed main(){cin>>n>>m;//建图 连边for(int i=1;i<=m;i++){int l,r,s;cin>>l>>r>>s;v.push_back({l-1,r,s});v.push_back({r,l-1,-s});}for(int i=0;i<n;i++) v.push_back({i+1,i,-1});//初始化for(int i=1;i<=n;i++) dis[i]=inf;dis[n]=0;//Bellman-Ford计算最短路  直接将第N+1次操作放入循环中for(int i=1;i<=n+1;i++){for(Node e:v){if(dis[e.v]>dis[e.u]+e.w){if(i==n+1){//若已经执行完n+1次松弛还可以继续执行,则无解cout<<-1<<endl;return 0;}dis[e.v]=dis[e.u]+e.w;}}}cout<<-dis[0]<<endl;	return 0;
}

相关文章:

  • 数据结构(4) 堆
  • Terraform 中的 external 数据块是什么?如何使用?
  • 软考-软件设计师中级备考 12、软件工程
  • Java 中使用 Callable 创建线程的方法
  • 【办公类-99-04】20250504闵豆统计表excle转PDF,合并PDF、添加中文字体页眉+边框下划线
  • postgresql数据库基本操作
  • JVM happens-before 原则有哪些?
  • 数字信号处理学习笔记--Chapter 1 离散时间信号与系统
  • AndroidLogger常用命令和搜索功能介绍
  • ESP32S3 多固件烧录方法、合并多个固件为单一固件方法
  • C语言实现数据结构:堆排序和二叉树_链式
  • 小土堆pytorch--tensorboard的使用
  • AI日报 · 2025年5月04日|Hugging Face 启动 MCP 全球创新挑战赛
  • 位置权限关掉还能看到IP属地吗?全面解析定位与IP的关系
  • nextjs+supabase vercel部署失败
  • 2025年第十六届蓝桥杯省赛B组Java题解【完整、易懂版】
  • GTID(全局事务标识符)的深入解析
  • better_fbx 下载
  • 金融信贷公司所需的技术和风控体系及其带来的价值
  • 个人文章不设置vip
  • 挑大梁!一季度北上广等7省份进出口占外贸总值四分之三
  • 太空飞梭项目起火,南宁方特东盟神画:明火已扑灭,无人受伤
  • 以色列消防部门:已控制住耶路撒冷山火
  • “三桶油”一季度净赚966亿元:业绩分化加剧,有人欢喜有人愁
  • 李在明回应韩国大法院判决:与自己所想截然不同,将顺从民意
  • 拍摄《我们这一代》的肖全开展“江浙沪叙事”