题解:AT_abc332_g [ABC332G] Not Too Many Balls
节选自:2025.7.8校测
一道典型的模拟网络流题目。
首先,朴素的网络流比较显然,我们从源点向所有不同颜色的球连一条容量为 \(a_i\) 的边,再从所有箱子向汇点连边,最后再从第 \(i\) 种颜色的球向第 \(j\) 个箱子连一条容量为 \(i \times j\) 的边,跑一遍网络最大流即可得出答案,但是 \(m\) 太大了,导致无论边数还是点数都炸了。因此我们考虑模拟网络流。
首先先将最大流转化成最小割。假设球当中与源点的边没有被切掉的集合是 \(X\),盒子中与汇点的
边没有被切掉的集合是 \(Y\),则 \(X\) 与 \(Y\) 间不能有边,总代价为 \(\displaystyle\sum_{i \not \in X} a_i + \sum_{j \not \in Y} b_j + \sum_{i \in X} \sum_{j \in Y} ij\),考虑到 \(n\) 很小,于是我们考虑在 \(n\) 上做文章。
我们假设 \(\displaystyle\sum_{i \in X} i = S\),那么此时 \(\displaystyle\sum_{i \in X} a_i\) 会有一个最小值。发现这其实是一个恰好的 \(01\) 背包,因此对于每一个 \(S\),我们都可以求出 \(\displaystyle\sum_{i \in X} a_i\) 的最小值 \(dp_S\),那么原式子就变成了 \(dp_S + S \displaystyle\sum_{j \in Y} j + \sum_{j \not \in Y} b_j\)。此时我们花费了 \(\mathcal O(n^3)\) 的时间复杂度。
于是现在就只用考虑 \(j\) 是放在 \(Y\) 中还是放在 \(Y\) 外。我们先假设所有数一开始都放在 \(Y\) 中,如果 \(b_j < S \times j\),我们就更新答案。具体来说,我们一开始将所有的 \(j\) 加到第 \(\left\lceil \displaystyle\frac{b_j}{j} \right\rceil\) 个 vector 中。接着我们从大到小枚举 \(S\),用第 \(\displaystyle\frac{n \times (n + 1)}{2} - i\) 个 vector 中存的数据更新答案即可,由于每一个数只会被从 \(Y\) 集合中转到 \(Y\) 集合外一次,一次这一部分的时间复杂度是 \(\mathcal O(m)\)。于是我们在 \(\mathcal(n^3 + m)\) 的时间复杂度内解决了这个问题。
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e2 + 9, M = 5e5 + 9;
int a[N], b[M], dp[N * N], n, m, ans = 1e18 + 9, sumij, sumb;
vector <int> vec[M];
signed main(){
scanf("%lld%lld", &n, &m);
for(int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
for(int i = 1; i <= m; i++)
scanf("%lld", &b[i]);
memset(dp, 0x3f, sizeof(dp));
dp[0] = 0;
for(int i = 1; i <= n; i++)
for(int j = i * (i + 1) / 2; j >= i; j--)
dp[j] = min(dp[j], dp[j - i] + a[i]);
for(int i = 1; i <= m; i++)
if(b[i] / i < n * (n + 1) / 2)
vec[b[i] / i + 1].push_back(i);
sumij = m * (m + 1) / 2;
for(int i = n * (n + 1) / 2; i >= 0; i--){
for(auto j : vec[n * (n + 1) / 2 - i]){
sumij -= j;
sumb += b[j];
}
ans = min(ans, dp[i] + (n * (n + 1) / 2 - i) * sumij + sumb);
}
printf("%lld", ans);
return 0;
}
本文来自博客园,作者:Orange_new,转载请注明原文链接:https://www.cnblogs.com/JPGOJCZX/p/18974908

浙公网安备 33010602011771号