1 条题解
-
0
题目分析
这是一个需要高效处理大量价格更新操作的问题。有两种操作:
INFLATION x:所有价格增加SET x y:将所有价格为 的菜品改为
直接模拟每次操作会超时,需要设计更高效的算法。
算法思路
核心思想
使用偏移量技巧 + 频率统计来优化操作:
- 偏移量
tag:记录累计的通胀值,避免频繁更新所有价格 - 频率映射
p:用map记录每个"基准价格"出现的次数 - 总和维护
su:维护当前总价格和,每次操作增量更新
关键观察
INFLATION操作只需更新偏移量和总和,时间复杂度SET操作通过映射找到对应价格的数量,时间复杂度
代码详解
数据结构定义
map<int,int> p; // 记录基准价格 -> 出现次数 int tag; // 累计通胀偏移量 int su; // 当前总价格和 int n, q; // 菜品数量和操作次数初始化
n = r(); for(ri i = 1; i <= n; ++i){ int a = r(); su += a; ++p[a]; // 记录初始价格分布 }处理操作
while(q--){ string op = gs(); if(op[0] == 'S'){ // SET操作 int x = r(), y = r(); // 计算基准价格(考虑偏移量) int base_price = x - tag; // 获取该价格的数量 int cnt = p[base_price]; // 更新映射 p[base_price] = 0; p[y - tag] += cnt; // 更新总和:数量 × (新价格 - 原价格) su += cnt * (y - x); } else { // INFLATION操作 int x = r(); su += x * n; // 总和增加 x × 菜品数量 tag += x; // 记录累计通胀 } wln(su); // 输出当前总和 }算法原理
偏移量技巧
实际价格 = 基准价格 + 偏移量
tag- 初始时:
tag = 0,基准价格就是实际价格 INFLATION x:tag += x,所有实际价格隐式增加SET x y:需要找到基准价格 =x - tag的菜品
复杂度分析
时间复杂度
- 初始化:
- 每个
SET操作: - 每个
INFLATION操作: - 总复杂度:
空间复杂度
- 存储价格分布
- 1
信息
- ID
- 5546
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者