本文共 1444 字,大约阅读时间需要 4 分钟。
数组操作问题解决方案
在这个问题中,我们需要处理一个大小为n的数组,并对它执行q次操作。操作分为两种:操作1用于修改数组中的特定位置的值,操作2用于将数组中所有小于某个值的元素修改为该值。我们的目标是根据这些操作,确定数组中每个位置的最终值。
操作类型:
挑战:
优化思路:
last[i] 记录第i个位置最后一次被操作1修改的操作编号。lastX[i] 记录第i个位置最后一次被操作1修改的值。lastAllToX[i] 记录第i次操作2之后的最大x值。关键步骤:
lastX[i]和lastAllToX[last[i]]中的最大值决定。#includeusing namespace std;const int maxn = 200100;int last[maxn], lastX[maxn], lastAllToX[maxn];int main() { int n, q, op, p, x; cin >> n; for (int i = 1; i <= n; ++i) { cin >> lastX[i]; } cin >> q; for (int i = 0; i < q; ++i) { cin >> op; if (op == 1) { cin >> p >> x; last[p] = i; lastX[p] = x; } else { cin >> x; lastAllToX[i] = x; } } for (int i = q - 1; i >= 0; --i) { if (lastAllToX[i] < lastAllToX[i + 1]) { lastAllToX[i] = lastAllToX[i + 1]; } } for (int i = 1; i <= n; ++i) { int res = max(lastX[i], lastAllToX[last[i]]); cout << res << " "; } cout << endl;}
输入处理:
处理操作:
构建最大值数组:
计算最终值:
这种方法确保了在处理大规模数据时的高效性,避免了直接模拟操作2对所有元素的修改,实现了时间复杂度为O(n + q)的优化。
转载地址:http://tvio.baihongyu.com/