一、问题背景
题目模拟了冰山的每日变化过程:
初始有n座体积各异的冰山
每天环境温度变化x(影响所有冰山体积)
可能新增体积为y的冰山
需要计算每日冰山总体积(对998244353取模)
二、核心算法思路
三、完整代码解析(带注释)
#include <iostream>#include <map>using namespACe std;const int MOD = 998244353;int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m, k;
cin >> n >> m >> k;
map<int, long long> cnt; // 体积->数量映射
// 初始化统计
for (int i = 0; i < n; ++i) {
int v;
cin >> v;
cnt[v]++;
}
for (int day = 0; day < m; ++day) {
int x, y;
cin >> x >> y;
map<int, long long> new_cnt;
long long sum = 0;
// 处理现有冰山
for (auto &[v, num] : cnt) {
int new_v = v + x;
if (new_v <= 0) continue;
if (new_v > k) {
new_cnt[k] = (new_cnt[k] + num) % MOD;
new_cnt[1] = (new_cnt[1] + (new_v - k) * num) % MOD;
} else {
new_cnt[new_v] = (new_cnt[new_v] + num) % MOD;
}
}
// 添加新冰山
if (y > 0) {
new_cnt[y] = (new_cnt[y] + 1) % MOD;
}
cnt = move(new_cnt);
// 计算总和
long long total = 0;
for (auto &[v, num] : cnt) {
total = (total + v * num) % MOD;
}
cout << total << "\n";
}
return 0;}四、关键算法点详解
映射优化:使用map将相同体积的冰山合并处理,避免重复计算
分裂处理:当冰山体积超过k时,自动分裂为1体积的小冰山
每日更新:采用new_cnt临时map确保状态同步更新
模运算处理:在每次加法操作后立即取模,防止数值溢出
五、复杂度分析
六、实际应用场景
这种映射统计方法广泛应用于:
游戏中的粒子系统模拟
物理仿真中的质量分布计算
资源管理中的分类统计
大数据中的分桶计数