From 0f4b3eef8f618b493c1bd4a67549a5906043ee67 Mon Sep 17 00:00:00 2001 From: Zengtudor Date: Wed, 19 Nov 2025 23:46:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0P3077=E9=A2=98?= =?UTF-8?q?=E8=A7=A3=E5=AE=9E=E7=8E=B0=E6=9C=80=E5=A4=A7=E6=9D=83=E5=80=BC?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/11/19/P3077.cpp | 70 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/11/19/P3077.cpp diff --git a/src/11/19/P3077.cpp b/src/11/19/P3077.cpp new file mode 100644 index 0000000..2d70c40 --- /dev/null +++ b/src/11/19/P3077.cpp @@ -0,0 +1,70 @@ +#include +#include +#include + +using ll = int64_t; + +ll n, m, r, ans; +std::vector a, b; +std::vector> ea; // 只保留左到右的邻接表即可 +std::vector dpa, dpb; // 不需要二维数组,一维即可 + +int main() { + // 优化输入输出 + std::ios::sync_with_stdio(false); + std::cin.tie(nullptr); + + std::cin >> n >> m >> r; + + // 调整大小 + a.resize(n + 1); + b.resize(m + 1); + ea.resize(n + 1); + dpa.resize(n + 1); + dpb.resize(m + 1); + + // 读入左岸权值并初始化 DP 和 ans + for (ll i = 1; i <= n; i++) { + std::cin >> a[i]; + dpa[i] = a[i]; // 路径可以只包含这一个点 + ans = std::max(ans, a[i]); + } + + // 读入右岸权值并初始化 DP 和 ans + for (ll i = 1; i <= m; i++) { + std::cin >> b[i]; + dpb[i] = b[i]; // 路径可以只包含这一个点 + ans = std::max(ans, b[i]); + } + + // 读入边,只存单向即可(左->右),后续通过排序处理顺序 + for (ll i = 1; i <= r; i++) { + ll u, v; + std::cin >> u >> v; + ea[u].push_back(v); + } + + // 核心逻辑:按照左岸点 u 从小到大,右岸点 v 从小到大的顺序处理每一条边 + // 这等同于正解中的 sort(e+1, e+r+1) + for (ll i = 1; i <= n; i++) { + // 对当前左岸点 i 连接的所有右岸点进行排序 + std::sort(ea[i].begin(), ea[i].end()); + + for (ll j : ea[i]) { + // 暂存数值,避免更新顺序影响(同正解中的 t1, t2) + // 从右岸 j 走到 左岸 i + ll val_to_left = dpb[j] + a[i]; + // 从左岸 i 走到 右岸 j + ll val_to_right = dpa[i] + b[j]; + + // 更新 DP 表 + dpa[i] = std::max(dpa[i], val_to_left); + dpb[j] = std::max(dpb[j], val_to_right); + + // 更新全局答案 + ans = std::max({ans, dpa[i], dpb[j]}); + } + } + + std::cout << ans << "\n"; +} \ No newline at end of file