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

[ABC422F-G] 题解

[ABC422F-G] 题解

F - Eat and Ride

考虑 DP,DP 状态要么压和要么压长度,如果压和就很直接,但是显然复杂度会爆炸,如果压长度的话,可以发现每到一个新点都要算:这条路径中在它后面的点的个数乘上它的点权,所以考虑枚举路径总长度 \(d\),那么设计状态 \(f_{i, j}\) 表示从 \(1\) 出发到达 \(i\) 经过 \(j\) 条边的最小代价,转移是 \(f_{i, j}\rightarrow f_{v, j + 1} + (d - j)a_v\),可以发现把 \(d - j\) 换元后不用枚举长度了,转移变成了 \(f_{i, j}\rightarrow f_{v, j - 1} + ja_v\),按照 \(j\) 从大到小的顺序转移即可。

时间复杂度:\(O(n^2)\)

// Problem: F - Eat and Ride
// Contest: AtCoder - AtCoder Beginner Contest 422
// Author: Moyou#include <algorithm>
#include <cstring>
#include <iostream>
#include <queue>
#define int long long
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
typedef pair<PII, int> PIII;
typedef long long ll;
const int N = 5000 + 10;int n, m, a[N], dist[N][N];
vector<int> g[N];
bool st[N][N];
void dijkstra(int s) {priority_queue<PIII, vector<PIII>, greater<PIII> > heap;memset(dist, 0x3f, sizeof dist), memset(st, 0, sizeof st);for(int i = 0; i <= n; i ++) dist[1][i] = i * a[1];for(int d = n; d; d --) {for(int t = 1; t <= n; t ++) {for(auto v : g[t])if(dist[v][d - 1] > dist[t][d] + (d - 1) * a[v])dist[v][d - 1] = dist[t][d] + (d - 1) * a[v];}}
}signed main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> n >> m;for(int i = 1; i <= n; i ++) cin >> a[i];for(int i = 1, a, b; i <= m; i ++) cin >> a >> b, g[a].push_back(b), g[b].push_back(a);dijkstra(1);for(int i = 1; i <= n; i ++)cout << dist[i][0] << '\n';return 0;
}

G - Balls and Boxes

第一问直接做完全背包,第二问需要给每个盒子里面的球分配编号,但是同一个盒子里面没有顺序,所以这是一个多重集排列,也就是最后只需要给第一问的答案乘上系数:

\[\dfrac {n!}{a!b!c!} \]

\(a, b, c\) 分别代表有几个球放在 \(A, B, C\) 盒子里面。

提取 \(n!\),考虑完全背包的转移式(假设转移 \(B\) 盒子):

\[f_i = \sum_{j}f_{i - j}\dfrac 1{j!}[j\equiv 0\pmod {b}] \]

不难发现这个是卷积的形式,用 FFT/NTT 优化即可。
时间复杂度:\(O(n\log n)\)

// Problem: F - Eat and Ride
// Contest: AtCoder - AtCoder Beginner Contest 422
// Author: Moyou#include <algorithm>
#include <cstring>
#include <iostream>
#include <queue>
#define int long long
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
typedef pair<PII, int> PIII;
typedef long long ll;
const int N = 5000 + 10;int n, m, a[N], dist[N][N];
vector<int> g[N];
bool st[N][N];
void dijkstra(int s) {priority_queue<PIII, vector<PIII>, greater<PIII> > heap;memset(dist, 0x3f, sizeof dist), memset(st, 0, sizeof st);for(int i = 0; i <= n; i ++) dist[1][i] = i * a[1];for(int d = n; d; d --) {for(int t = 1; t <= n; t ++) {for(auto v : g[t])if(dist[v][d - 1] > dist[t][d] + (d - 1) * a[v])dist[v][d - 1] = dist[t][d] + (d - 1) * a[v];}}
}signed main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> n >> m;for(int i = 1; i <= n; i ++) cin >> a[i];for(int i = 1, a, b; i <= m; i ++) cin >> a >> b, g[a].push_back(b), g[b].push_back(a);dijkstra(1);for(int i = 1; i <= n; i ++)cout << dist[i][0] << '\n';return 0;
}
http://www.hskmm.com/?act=detail&tid=16886

相关文章:

  • 别再靠 “关设备” 减碳!EMS 的 “预测性控能”,让企业满产也能达标双碳
  • LAMP 架构说明及部署实践 - 教程
  • MyEMS 深度解析:核心功能模块、数据流转逻辑与工业能源优化落地路径
  • kettle插件-国产数据库金仓插件,助力国产数据库腾飞
  • 制造业碳足迹追踪:开源能源管理系统如何助力企业实现“碳数据可视化”?
  • iframe安全盲区:支付信息窃取攻击的新温床 - 教程
  • 综合网表中有assign怎么办
  • 极限与导数
  • 呼叫中心开源社区专栏第一篇 - 详解
  • 原核表达可溶性蛋白难题破解
  • 深入解析:Adobe Fresco下载教程Adobe Fresco 2025保姆级安装步骤(附安装包)
  • Torch中的tensor size
  • Codeforces 1053 (Div.2)
  • 抗体药物偶联物(ADCs)生物分析:拆解 “靶向导弹” 体内轨迹的核心技术
  • 详细介绍:微服务的适用边界:从金融科技到量子计算的架构哲学
  • 使用IOT-Tree整合复杂计算模型(含AI模型),并对接现场设备优化控制(节能提效)技能方案
  • 为什么应该测试无JavaScript的页面体验
  • 前台部分数据不显示
  • 指针定义以及二维数组内存地址(java/c++/python)
  • 解码数据结构线性表之顺序表
  • 中电金信:源启数据集成平台全新升级,实现便捷与性能双飞跃
  • Jupyter NoteBook / Jupyter Lab的安装与使用
  • 完整教程:科技的温情——挽救鼠鼠/兔兔的生命
  • 易基因:Nat Rev Drug Discov/IF101.8:何川团队顶刊综述RNA修饰系统作为疾病治疗靶点的研究进展
  • 国产适配 + AI 一键生成!亿图图示 14.5 全平台绘图指南:260 种图表 + Visio 兼容,开发者 / 办公党速藏
  • 关闭Cadence Allegro Design Entry CIS(OrCAD Capture)的Start Page
  • Mini L-CTF 2025 WP
  • K8S APIServer压力高,导致控制器Leader续约失败而重启问题
  • 【2025-09-24】连岳摘抄
  • 8K 视频修复提速 50%!Topaz Video AI 7.0.0 实战指南:AI 增强 + 本地化模型 + GPU 加速全解析